当前位置: 首页 > 编程语言 > C#

(尝试)从WSE3.0迁移到WCF以获取客户端代码共享

时间:2023-04-11 10:31:59 C#

(尝试)从WSE3.0迁移到WCF以获取客户端代码我一直在线为此。我刚入魔一段时间,我尝试使用的ISP拒绝正式支持WCF作为一种使用方法。我不是Web服务方面的专家,所以我会尽力记录和解释这篇文章,但无论如何,如果您需要它,请询问更多信息,希望我能够提供任何必要的信息。服务在我的公司,我们使用公开服务的供应商应用程序。该应用程序是用java编写的,看起来wsdl是使用ApacheAxis1.2创建的。代码我的遗留代码使用WSE3.0。特别是,它使用在末尾自动添加“WSE”的代理类。这使我可以使用更简单的身份验证方案(我可以让它工作的唯一方法)。我不需要使用证书。我使用SecurityPolicyAssertion的派生并将其包装在传递给客户端类的SetPolicy方法的Policy对象中。以下是创建客户端工作实例所需的全部内容:MyWebServiceWseapi=newMyWebServiceWse();api.Url=myUrl;api.SetPolicy(新策略(新MyDerivedSecurityAssertion(用户,通过)));我的默认值,开箱即用开箱即用的WCF代码(使用服务引用生成)不接受凭据,所以我知道现在有问题。我在网上阅读了各种关于在app.config中使用不同的安全性或绑定设置的内容,但没有任何效果。经过大量修改后,我遇到的最常见错误是WSDoAllReceiver:RequestdoesnotcontainrequiredSecurityheader。这是app.config。也许我们可以先告诉我这里应该更改什么以方便通过证书-同样,我在网上看到了不同的意见。我更改了一些属性以掩盖我们正在使用的特定服务(公司政策等)。这是到目前为止的示例C#代码(在控制台应用程序中测试):MyClientclient=newMyClient();client.listMethod();更新阅读这篇SO帖子:wcfsecurity。...我相应地更新了我的app.config,现在我在代码中传递用户名和密码。我仍然收到相同的错误:WSDoAllReceiver:请求不包含必需的安全标头20120517更新成功的请求(来自WSE3):urn:uuid:cb739422-c077-4eec-8cb2-686837b76878http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymoushttp://removed-for-security2012-05-17T11:25:41Z2012-05-17T11:30:41Zchange-to-protect-the-innocentnice-tryKJMvUuWF2eO2uIJCuxJC4A==2012-05-17T11:25:41Z010致力于获取WCF跟踪-将很快添加。20120517更新2这是WCF信封:1214748364720120518更新我尝试在评论中链接的MikeMiller帖子中实施解决方案。现在我收到以下错误(没有消息最终被发送,因为正在计划中):提供的URI方案“http”无效;预期“https”。如果有人想问,是的,我需要通过http发送,是的,我知道凭据作为未加密的字符串发送:-)您需要的是通过http传输发送用户名令牌,wcfootb不支持。此外,您的令牌使用nonce/created,这也不是ootb。您有2个选项:这个oss项目将nonce/created添加到用户名令牌。这个oss项目增加了通过http发送用户名的功能。您需要结合这两个项目。ws-security通常被认为是复杂的,但您可以以最简单的形式(用户名)使用它。最简单的方法是一起取消所有wcf安全设置,并在消息检查器中自己创建整个安全标头!如您所见,大多数标头只是静态xml节点,并且大多数值都非常清楚(您知道用户名)。只有两个比较棘手的是nonce和timestamp,你可以看看这个oss项目是怎么做的(一行一行)。此选项的变体可能更容易-毕竟使用CUB并实现推送timestmpa/nonce的自定义编码器。我会选择后者,但由于我开发了CUB,所以我有偏见......您还可以在自定义编码“messageVersion”属性上配置ws-addressing标头。由于您省略了使用wsa前缀定义的信封标头,所以我真的不能说出确切的值是什么。如果您私下需要帮助(因为您似乎有安全限制),请通过我的博客给我发电子邮件。编辑:我已经为你实现了。请按照以下步骤操作:下载Cub并熟悉它(不是在内部,根据博客文章如何使用它)添加对System.Runtime.Serialization.dll的引用到项目ClearUsernameBinding添加一个新文件到项目:UsernameExEncoder。CS。粘贴此内容:usingSystem;使用System.Collections.Generic;使用System.Linq;使用系统文本;使用System.ServiceModel.Channels;使用System.IO;使用System.Xml;使用System.Security.Cryptography;namespaceWebservices20.BindingExtensions{classUsernameExEncoderBindingElement:MessageEncodingBindingElement{MessageEncodingBindingElementinner;publicUsernameExEncoderBindingElement(MessageEncodingBindingElementinner){this.inner=inner;}publicoverrideIChannelFactoryBuildChannelFactory(BindingContextcontext){context.BindingParameters.Add(this);varres=base.BuildChannelFactory(context);返回资源;}publicoverrideboolCanBuildChannelFactory(BindingContextcontext){varres=base.CanBuildChannelFactory(context);返回资源;}publicoverrideMessageEncoderFactoryCreateMessageEncoderFactory(){returnnewUsernameExEncoderFactory(this.inner.CreateMessageEncoderFactory());}publicoverrideMessageVersionMessageVersion{得到{返回this.inner.MessageVersion;}设置{this.inner.MessageVersion=value;}}publicoverrideBindingElementClone(){varc=(MessageEncodingBindingElement)this.inner.Clone();varres=newUsernameExEncoderBindingElement(c);返回资源;}publicoverrideTGetProperty(BindingContextcontext){varres=this.inner.GetProperty(context);返回资源;}}classUsernameExEncoderFactory:MessageEncoderFactory{MessageEncoderFactoryinner;publicUsernameExEncoderFactory(MessageEncoderFactoryinner){this.inner=inner;}publicoverrideMessageEncoderEncoder{get{returnnewUsernameExEncoder(inner.Encoder);}}publicoverrideMessageVersionMessageVersion{get{returnthis.inner.MessageVersion;}}}classUsernameExEncoder:MessageEncoder{MessageEncoderinner;publicoverrideTGetProperty(){returninner.GetProperty();}publicUsernameExEncoder(MessageEncoderinner){this.inner=inner;}公共覆盖字符串ContentType{get{返回this.inner.ContentType;}}publicoverridestringMediaType{get{returnthis.inner.MediaType;}}publicoverrideMessageVersionMessageVersion{get{returnthis.inner.MessageVersion;}}publicoverrideboolIsContentTypeSupported(stringcontentType){returnthis.inner.IsContentTypeSupported(contentType);}publicoverrideMessageReadMessage(ArraySegmentbuffer,BufferManagerbufferManager,stringcontentType){returnthis.inner.ReadMessage(buffer,bufferManager,contentType);}publicoverrideMessageReadMessage(System.IO.Streamstream,intmaxSizeOfHeaders,stringcontentType){returnthis.inner.ReadMessage(stream,maxSizeOfHeaders,contentType);}publicoverrideArraySegmentWriteMessage(Messagemessage,intmaxMessageSize,BufferManagerbufferManager,intmessageOffset){//加载消息到domvarmem=newMemoryStream();varx=XmlWriter.Create(mem);消息.WriteMessage(x);x.Flush();mem.Flush();内存位置条件=0;XmlDocumentdoc=newXmlDocument();文档.Load(mem);//添加缺失的元素vartoken=doc.SelectSingleNode("//*[local-name(.)='UsernameToken']");varcreated=doc.CreateElement("已创建","http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd");varnonce=doc.CreateElement("Nonce","http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd");token.AppendChild(已创建);token.AppendChild(nonce);//设置nonce值byte[]nonce_bytes=newbyte[16];RandomNumberGeneratorrndGenerator=newRNGCryptoServiceProvider();rndGenerator.GetBytes(nonce_bytes);nonce.InnerText=Convert.ToBase64String(nonce_bytes);//设置创建值created.InnerText=XmlConvert.ToString(DateTime.Now.ToUniversalTime(),"yyyy-MM-ddTHH:mm:ssZ");//创建一条新消息varr=XmlReader.Create(newStringReader(doc.OuterXml));varnewMsg=Message.CreateMessage(message.Version,message.Headers.Action,r);返回this.inner.WriteMessage(newMsg,maxMessageSize,bufferManager,messageOffset);}publicoverridevoidWriteMessage(Messagemessage,System.IO.Streamstream){this.inner.WriteMessage(message,stream);}}}在ClearUsernameBinding中。cs文件:res.Add(newTextMessageEncodingBindingElement(){MessageVersion=this.messageVersion});有了这个:vartextEncoder=newTextMessageEncodingBindingElement(){MessageVersion=this.messageVersion};res.Add(newUsernameExEncoderBindingElement(textEncoder));在app.config中的项目TestClient中,绑定元素上有一个messageVersion属性你还没有发布信封的根,所以我不能确定,但??你可能需要将它设置为Soap11WSAddressingAugust2004或Soap11WSAddressing10(或使用肥皂12)之一。祝你好运!以上就是C#学习教程:(尝试)从WSE3.0迁移到WCF,获取客户端代码分享的全部内容。如果对大家有用,需要了解更多C#学习教程,希望大家多加关注——本文来自网络合集,不代表立场,如涉及侵权,请右击联系管理员删除。如需转载请注明出处:

最新推荐
猜你喜欢