2017-01-30 134 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

谢谢,那里有一点隧道视野。现在完美工作。 –