小编KCT*_*KCT的帖子

EWS:NetworkCredential与F#中的ExchangeCredentials不兼容

我喜欢使用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# type-systems exchange-server exchangewebservices

8
推荐指数
1
解决办法
606
查看次数

为什么我必须将Async <T>包装到另一个异步工作流中并让它!它?

我正在尝试理解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)

f# asynchronous let async-workflow

5
推荐指数
1
解决办法
142
查看次数

为什么嵌套字典的反序列化会在C#中引发异常但在F#中有效?

我使用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)

c# f# exception json.net deserialization

4
推荐指数
1
解决办法
531
查看次数