2016-01-23 15 views
8

Tôi thích sử dụng API Microsoft.Exchange.WebService:EWS: NetworkCredential không tương thích với ExchangeCredentials trong F #

C# hoạt động tốt

ExchangeService service = new ExchangeService(userData.Version); 
service.Credentials = new NetworkCredential(userData.EmailAddress, userData.Password); 

F # cung cấp cho các lỗi: Các loại 'NetworkCredential' không phải là tương thích với '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 

Tôi nghĩ rằng nó có liên quan đến chuyển đổi ngầm định được xác định trong API C#. vì vậy tôi đã thử (:>) và downcast (:?>). Tôi đã cố gắng để làm cho nó explicite (mới NetworkCredential ...: ExchangeCredentials) và tôi đã kiểm tra các dlls tham chiếu như tôi được sử dụng trong C# nuget trực tiếp và trong F # paket. Cả hai thử nghiệm trong VS 2015. Trong C# nó Net 4.5.2 và trong F #, quá nếu đó là cách chính xác để nhìn nó trong app.config

<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.2" /> 

Và tôi đoán sử dụng WebCredentials là không chính xác đường. Tôi muốn sử dụng một SecureString và không phải là một chuỗi và nếu làm việc trong C#. Vì vậy, có nhiều khả năng tôi đã làm điều gì đó sai với cú pháp F # mà tôi muốn hiểu.

+0

Cảm ơn bạn đã gợi ý. Nhưng vấn đề là cái gì khác. Xem giải pháp từ TheInnerLight bên dưới. – KCT

Trả lời

7

Như bạn đã nhận thấy ExchangeCredentials xác định chuyển đổi ẩn từ NetworkCredentials thành ExchangeCredentials, đó là lý do mã của bạn hoạt động chính xác trong C#. Lưu ý rằng không có mối quan hệ thừa kế giữa hai điều này, do đó bạn không thể sử dụng toán tử upcast (:>) và downcast (:?>).

Chuyển đổi ngầm xuất hiện trong F # dưới dạng thành viên tĩnh được gọi là op_Implicit.

let connectToService userData = 
    let service = new ExchangeService(userData.Version) 
    service.Credentials <- 
     NetworkCredential(userData.EmailAddress, userData.Password) 
     |> ExchangeCredentials.op_Implicit // call implicit conversion 
    service.Url <- userData.AutodicoverUrl 
+0

Cảm ơn rất nhiều! Đó là mất tích. – KCT

Các vấn đề liên quan