2016-01-23 30 views
8

mi piace utilizzare l'API Microsoft.Exchange.WebService:EWS: NetworkCredential non è compatibile con ExchangeCredentials in F #

C# funziona bene

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

F # dà l'errore: Il tipo 'NetworkCredential' non è compatibile con '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 

ho pensato che ha qualcosa a che fare con la conversione implicita che è definito nel C# API. così ho provato (:>) e downcast (:?>). Ho provato a renderlo esplicito (nuovo NetworkCredential ...: ExchangeCredentials) e ho controllato le dll di riferimento come ho usato in C# nuget direttamente e in F # paket. Entrambi provati in VS 2015. In C# è .Net 4.5.2 e in F #, anche se è il modo corretto di guardare in su nel app.config

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

E credo che usando WebCredentials non sia corretta modo. Voglio usare un SecureString e non una stringa e se funziona in C#. Quindi è più probabile che ho fatto qualcosa di sbagliato con la sintassi F # che vorrei capire.

+0

Grazie per il vostro suggerimento. Ma il problema era qualcos'altro. Vedere la soluzione di TheInnerLight di seguito. – KCT

risposta

7

Come si è notato, ExchangeCredentials definisce una conversione implicita da NetworkCredentials a ExchangeCredentials, motivo per cui il codice funziona correttamente in C#. Si noti che non esiste alcuna relazione di ereditarietà tra queste due cose, quindi non è possibile utilizzare gli operatori upcast (:>) e downcast (:?>).

Le conversioni implicite vengono visualizzate in F # come membro statico chiamato 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

Grazie mille! Quello che mancava. – KCT