2017-01-30 83 views
1

我已經使用了WSDL並且已成功稱爲web服務方法。該請求具有隻能在請求發生時添加的授權標頭:向服務引用SOAP請求添加授權標頭

public static NumberCaptureClient Connect() 
    { 
     var remoteAddress = new EndpointAddress("https://website.com:8443/webservice/WebServiceNumberCapture"); 

     using (var NumberCaptureClient = new NumberCaptureClient(new BasicHttpBinding(BasicHttpSecurityMode.Transport), remoteAddress)) 
     { 
      NumberCapture.ClientCredentials.UserName.UserName = "test"; 
      NumberCapture.ClientCredentials.UserName.Password = "test"; 

      try 
      { 
       using (OperationContextScope scope = new OperationContextScope(NumberCaptureClient.InnerChannel)) 
       { 
        var httpRequestProperty = new HttpRequestMessageProperty(); 

        httpRequestProperty.Headers[HttpRequestHeader.Authorization] = "Basic " + 
        Convert.ToBase64String(Encoding.ASCII.GetBytes(NumberCaptureClient.ClientCredentials.UserName.UserName + ":" + NumberCaptureClient.ClientCredentials.UserName.Password)); 

        OperationContext.Current.OutgoingMessageProperties[HttpRequestMessageProperty.Name] = httpRequestProperty; 
       } 

      } 
      catch (Exception error) 
      { 
       MessageBox.Show("Error"); 
       return null; 
      } 

      return NumberCaptureClient; 
     }  
    } 

正如你所看到的,我需要返回一個代理客戶端的實例(客戶端已經擁有所有需要頭文件的方法),但是需要它,所以頭文件總是被髮送,'using'子句,這是不可能的,因爲範圍在其之外。

有沒有辦法永久添加標題,以便它們隨每個請求發送到webservice?

回答

1

這是一個WCF代理,對吧?一般而言,您應該從Connect方法中刪除using。如果該方法用於獲取準備好的服務代理,那麼將它作爲創建它的方法的一部分進行處理是沒有意義的。

相反,該方法/代碼,使用Connect方法應該負責的using它:

using(var proxy = theClass.Connect()) 
{ 
    // call service using proxy here 

    // process response here, if you may need to call the service again 
    // as part of processing 
} 
// process response here if you don't need to call the service again 

有一個catch但是,由於WCF代理等Dispose方法內部調用Close方法,該方法反過來可以拋出異常。因此,Microsoft建議如何處理WCF代理的清理。見here

+0

謝謝,那裏有一點隧道視野。現在完美工作。 –