如何解决将授权标头添加到WCF支架式SOAP Web服务
免责声明:我从未使用过SOAP Web服务。完全没有一点儿都没有。因此,渠道和WCF脚手架的概念让我有些困惑,因此我在这里。
我被要求集成到使用基本身份验证的SOAP XML Web服务中。 (例如,授权标头,基本xxxxxxxxxxxxxxxxxxxxxxxxxxxx
我已经使用Visual Studio WCF连接的服务发现来生成脚手架代码,该代码很好地实例化了所需的对象等,但是我的问题是我被要求使用基本身份验证,我不知道该在哪里使用。将此代码注入已生产的脚手架中。之前我已经使用过基本身份验证,因此我了解REST API等功能的“如何”做。只需用户名:密码,base64编码并添加到Authorization标头即可。但是,我不确定如何为这个脚手架SOAP Web服务执行此操作。
我相信可以添加到每个请求中以添加自定义标头的代码是:
using (OperationContextScope scope = new OperationContextScope(IContextChannel or OperationContext)
{
OperationContext.Current.OutgoingMessageProperties[HttpRequestMessageProperty.Name] = new HttpRequestMessageProperty()
{
Headers =
{
{ "MyCustomHeader",Environment.UserName },{ HttpRequestHeader.UserAgent,"My Custom Agent"}
}
};
// perform proxy operations...
}
OperationContextScope需要一个IContextChannel或OperationContext。我对要在此处添加的内容感到困惑。如果我查看脚手架的代码,则可以在以下位置找到Web服务的“客户端”:
public partial class POSUserInformationManagerV1_2Client : System.ServiceModel.ClientBase<McaEndpointPosUserInformation.POSUserInformationManagerV1_2>,McaEndpointPosUserInformation.POSUserInformationManagerV1_2
我可以在这里找到“通道”,但这只是另一个接口,没有指定任何合同?
[System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.Tools.ServiceModel.Svcutil","2.0.2")]
public interface POSUserInformationManagerV1_2Channel : McaEndpointPosUserInformation.POSUserInformationManagerV1_2,System.ServiceModel.IClientChannel
{
}
我查找了ChannelBase,看来它应该接受实现一个或另一个通道接口的各种对象(包括IClientChannel,这是脚手架的POSUserInformationManagerV1_2Channel使用的对象)
protected class ChannelBase<T> : IDisposable,IChannel,ICommunicationObject,IOutputChannel,IRequestChannel,IClientChannel,IContextChannel,IExtensibleObject<IContextChannel> where T : class
{
protected ChannelBase(ClientBase<T> client);
[SecuritySafeCritical]
protected IAsyncResult BeginInvoke(string methodName,object[] args,AsyncCallback callback,object state);
[SecuritySafeCritical]
protected object EndInvoke(string methodName,IAsyncResult result);
但是我仍然停留在可以放入OperationContextScope中的内容上,以将其适当地连接到“通道”。我已经尝试过POSUserInformationManagerV1_2Client和relevent Channel接口,但是都不会转换为IContextChannel。有人有什么想法/想法吗?
编辑:这是我尝试注入代码以添加Auth HTTP标头的地方:
public System.Threading.Tasks.Task<McaEndpointPosUserInformation.requestUserInformationResponse> requestUserInformationAsync(McaEndpointPosUserInformation.requestUserInformation request)
{
using (OperationContextScope scope = new OperationContextScope(request)
{
OperationContext.Current.OutgoingMessageProperties[HttpRequestMessageProperty.Name] = new HttpRequestMessageProperty()
{
Headers =
{
{ "MyCustomHeader","My Custom Agent"}
}
};
// perform proxy operations...
}
return base.Channel.requestUserInformationAsync(request);
}
解决方法
事实证明,该问题不是通过使用以下方法将运输安全性设置为“基本”:
// Set the binding. Without this,the WCF call will be made as anonymous
var binding = new BasicHttpsBinding();
binding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Basic;
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。