我已经使用了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服务?
答案 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。