我喜欢使用Microsoft.Exchange.WebService API:
C#工作正常
ExchangeService service = new ExchangeService(userData.Version);
service.Credentials = new NetworkCredential(userData.EmailAddress, userData.Password);
Run Code Online (Sandbox Code Playgroud)
F#给出错误:"NetworkCredential"类型与"ExchangeCredential"不兼容
open System
open Microsoft.Exchange.WebServices.Data
open System.Net
[<EntryPoint>]
let main argv =
let connectToService userData =
let service = new ExchangeService(userData.Version)
do
service.Credentials <- new NetworkCredential(userData.EmailAddress, userData.Password)
service.Url <- userData.AutodicoverUrl
0
Run Code Online (Sandbox Code Playgroud)
我认为它与C#API中定义的隐式转换有关.所以我尝试了(:>)和downcast(:?>).我试图使它explicite(新的NetworkCredential ...:ExchangeCredentials)和我在C#直接的NuGet和F#的一揽子贷款使用我检查所引用的DLL.两者都在VS 2015中进行了测试.在C#中它是.Net 4.5.2和F#,如果它是在app.config中查找它的正确方法
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.2" />
Run Code Online (Sandbox Code Playgroud)
我猜使用WebCredentials不是正确的方法.我想使用SecureString而不是字符串,如果在C#中工作.因此,我更有可能对我想要了解的F#语法做错了.
我正在尝试理解F#中的异步工作流程,但我发现有一部分我真的不明白,希望有人可以帮助我.
以下代码工作正常:
let asynWorkflow = async{
let! result = Stream.TryOpenAsync(partition) |> Async.AwaitTask
return result
}
let stream = Async.RunSynchronously asynWorkflow
|> fun openResult -> if openResult.Found then openResult.Stream else Stream(partition)
Run Code Online (Sandbox Code Playgroud)
我定义了一个异步工作流,其中TryOpenAsync返回一个Task类型.我用Async.AwaitTask将它转换为Async.(副任务:"等待"任务?它不等待它只是转换它,是吗?我认为它与Task.Wait或await关键字无关).让我"等待"它!并返回它.要启动工作流,我使用RunSynchronously,它应该启动工作流并返回结果(绑定它).在结果上,我检查是否找不到流.
但现在是我的第一个问题.为什么我必须在另一个异步计算中包装TryOpenAsync调用并让它!("等待")吗?例如,以下代码不起作用:
let asynWorkflow = Stream.TryOpenAsync(partition) |> Async.AwaitTask
let stream = Async.RunSynchronously asynWorkflow
|> fun openResult -> if openResult.Found then openResult.Stream else Stream(partition)
Run Code Online (Sandbox Code Playgroud)
我认为AwaitTask使它成为Async和RunSynchronously应该启动它.然后使用结果.我错过了什么?
我的第二个问题是为什么有"Async.Let!" 功能可用?也许是因为它不起作用或更好,为什么它不适用于以下代码?
let ``let!`` task = async{
let! result = task |> Async.AwaitTask
return result
}
let stream = Async.RunSynchronously ( ``let!`` (Stream.TryOpenAsync(partition)) )
|> fun …
Run Code Online (Sandbox Code Playgroud) 我使用Newtonsoft.Json.FSharp将F#记录类型序列化为Json.
type Prices = Dictionary<string, decimal>
type PriceList = {Id:string; Name:string; Date:DateTime; CurrencySymbol:string; Status:Status; Prices:Prices}
let private converters : JsonConverter array =
[| BigIntConverter();
GuidConverter();
ListConverter();
OptionConverter();
MapConverter();
TupleArrayConverter();
UnionConverter();
UriConverter();
CultureInfoConverter() |]
let private settings = JsonSerializerSettings (
Converters = converters,
Formatting = Formatting.Indented,
NullValueHandling = NullValueHandling.Ignore)
let serialize obj = JsonConvert.SerializeObject(obj, settings)
Run Code Online (Sandbox Code Playgroud)
JSON的结果是这样的:
{
"Id": "PriceList20140201",
"Name": "PriceList",
"Date": "2014-02-01T00:00:00+01:00",
"CurrencySymbol": "€",
"Status": 0,
"Prices": {
"ItemCodeA": 512.4,
"ItemCodeB": 471.0
}
}
Run Code Online (Sandbox Code Playgroud)
如果我反序列化它,它工作正常
JsonConvert.DeserializeObject<PriceList>(text)
Run Code Online (Sandbox Code Playgroud)
结果F#Interactive:
val y : …
Run Code Online (Sandbox Code Playgroud)