2016-01-23 2 views
8

Ich mag die Microsoft.Exchange.WebService API verwenden:EWS: NetworkCredential nicht kompatibel mit ExchangeCredentials in F #

C# funktioniert

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

F # gibt den Fehler: Der Typ 'NetworkCredential' ist nicht kompatibel mit ‚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 

ich dachte, es hat etwas mit impliziter Konvertierung zu tun hat, die in dem C# API definiert ist. Also habe ich versucht (:>) und downcast (:?>). Ich habe versucht, es explizit zu machen (neues NetworkCredential ...: ExchangeCredentials) und ich habe die referenzierten DLLs überprüft, wie ich in C# nuget direkt und in F # paket verwendet habe. Sowohl in VS getestet 2015. In C# ist es .Net 4.5.2 und in F #, auch wenn es der richtige Weg ist es in der app.config

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

zu sehen Und ich denke, WebCredentials verwendet, ist nicht die richtige Weg. Ich möchte einen SecureString und keine Zeichenfolge verwenden und funktioniert in C#. Es ist also wahrscheinlicher, dass ich etwas falsch mit der F # -Syntax gemacht habe, die ich gerne verstehen würde.

+0

Vielen Dank für Ihren Hinweis. Aber das Problem war etwas anderes. Siehe Lösung von TheInnerLight unten. – KCT

Antwort

7

Wie Sie festgestellt haben, definiert ExchangeCredentials eine implizite Konvertierung von NetworkCredentials zu ExchangeCredentials, weshalb Ihr Code in C# korrekt funktioniert. Beachten Sie, dass zwischen diesen beiden Dingen keine Vererbungsbeziehung besteht. Daher können Sie die Operatoren upcast (:>) und downcast (:?>) nicht verwenden.

Implizite Konvertierungen werden in F # als statisches Element namens op_Implicit angezeigt.

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

Vielen Dank! Das hat gefehlt. – KCT

Verwandte Themen