3

我知道這個問題的變體已被問到,但我試過所有建議的解決方案都無濟於事。我們正嘗試連接到使用基本身份驗證和傳輸安全性的WCF服務(不幸的是,這些事情不能改變)。我一直無法找到一種方法在WCF調用中將我們的憑證添加到TRANSPORT;所有的解決方案似乎都是在爲郵件添加標題。在Windows Phone 7上使用基於SSL的基本身份驗證

我們最新的嘗試是使用HttpWebClient從服務器獲取文本文件,該文件附加了憑證,然後進行WCF調用;我們希望認證能夠......然後我不知道從HttpWebClient跳轉到WCF客戶端(使用Service Reference生成)。在第一次調用確實起作用的時候,我們在WCF調用中得到一個CommunicationException(如果我深入瞭解響應,狀態描述設置爲未授權)。

有沒有辦法讓客戶端共享成功嘗試返回的授權令牌?這是一個傻瓜的差事嗎?有沒有更簡單的方法可以讓我盲目地看到?

HttpWebRequest request = (HttpWebRequest)WebRequest.Create(new Uri("https://server/OGTE/api/WinPhone7.html")); 

     request.Credentials = new NetworkCredential(_userName, _password, _domain); 
     request.Method = "GET"; 

     request.BeginGetResponse((beginGetResponseResult) => 
     { 
      try 
      { 
       HttpWebRequest requestWhileResponding = (HttpWebRequest)beginGetResponseResult.AsyncState; 
       HttpWebResponse response = (HttpWebResponse)requestWhileResponding.EndGetResponse(beginGetResponseResult); 

       try 
       { 
        using (StreamReader streamReader1 = new StreamReader(response.GetResponseStream())) 
        { 

         string info = streamReader1.ReadToEnd(); 

         Dispatcher.BeginInvoke(() => 
                { 
                 textblock.Text = info; 
                }); 

        } 

        _userDataService.GetDataCompleted += new EventHandler<GetDataCompletedEventArgs>(_userDataService_GetDataCompleted); 
        _userDataService.GetDataAsync("0C5696BB-2D15-4EA7-B198-5C12B3E23B63"); 

       } 
       catch (Exception ex) 
       { 

        Debug.WriteLine(ex.ToString()); 
       } 

      } 
      catch (Exception ex) 
      { 
       Debug.WriteLine(ex.ToString()); 
      } 
     }, 

    request); 
    } 

回答

1

對於那些好奇的人,事實證明,我上面的嘗試是完全沒有必要的。原來,授權標題可以手動設置,發現它是這個奇妙的文章:http://cisforcoder.wordpress.com/2010/12/01/how-to-implement-basic-http-authentication-in-wcf-on-windows-phone-7/。它的一般要點是獲得當前的背景下,並設置了頭,如下所示:

var credentials = EncodeBasicAuthenticationCredentials("username", "password"); 

using (OperationContextScope scope = 
     new OperationContextScope(service.InnerChannel)) 
{ 
    HttpRequestMessageProperty request = new HttpRequestMessageProperty(); 
    request.Headers[System.Net.HttpRequestHeader.Authorization] = 
     "Basic " + credentials; 

    OperationContext.Current.OutgoingMessageProperties.Add(
           HttpRequestMessageProperty.Name, request); 

    service.DoSomethingAsync(); 
} 

希望有一天很快這樣的事情不會是必要的,但在那之前,我希望這能讓一個人開始他們的項目比我能夠做得更快。

2

另一種解決方案是,使用RestSharp來調用REST服務時,您的生活將更加輕鬆。他們有一個HttpBasicAuthenticator,你也可以創建你自己的驗證器。它還使得爲REST資源構建uris變得更加容易。 以下是關於使用WCF REST服務進行身份驗證的blog post。您可以看到使用RestSharp的客戶端示例代碼