将Authorization标头添加到服务引用SOAP请求

时间:2017-01-30 16:37:26

标签: c# web-services

我已经使用了WSDL并成功调用了Web服务方法。请求有一个Authorization标头,只能在发出请求时添加:

    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'子句因为范围在它之外丢失,所以是不可能的。

有没有办法永久添加标题,以便随每次请求发送到Web服务?

1 个答案:

答案 0 :(得分:1)

这是一个WCF代理,对吗?一般来说,您应该从using方法中删除Connect。如果该方法用于获取准备好的服务代理,则将其作为创建它的方法的一部分进行处理是没有意义的。

相反,使用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

然而,有一个问题,因为对于WCF个代理,Dispose方法在内部调用Close方法,而后者又可以抛出异常。出于这个原因,Microsoft建议如何处理WCF代理的清理。请参阅here