在Visual 2010中,我创建了一个客户端来使用web服务,使用WSDL自动创建代理类。在开发环境中,这是可以的,因为它不需要在这个环境中进行身份验证。
我遇到的问题是,在测试和生产环境(真正的工作环境)中,服务具有身份验证。WSDL没有描述它。它们都使用相同的开发环境WSDL。
如果我尝试使用浏览器在测试环境中查看WSDL,将"?WSDL“放在端点地址之后,它就不会像开发环境那样返回WSDL。它返回一个身份验证表单,一个普通的html,在通知用户和密码之后,它返回WSDL (与开发环境相同)。
我做了这样的app.config绑定信任:
<wsHttpBinding>
<binding name="WebServiceSoapAuth" closeTimeout="00:01:00" openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00" allowCookies="true" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard" maxBufferPoolSize="524288" maxReceivedMessageSize="65536" messageEncoding="Mtom" textEncoding="utf-8" useDefaultWebProxy="true">
<readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384" maxBytesPerRead="4096" maxNameTableCharCount="16384"/>
<security mode="None">
<transport clientCredentialType="Basic" proxyCredentialType="None" realm=""/>
<message clientCredentialType="UserName" algorithmSuite="Default"/>
</security>
</binding>
</wsHttpBinding>如果我使用VS 2010自动创建的basicHttpBinding (在dev环境中工作),我的服务使用者将返回“无法进行身份验证或授权的安全令牌”,正如预期的那样。
更改为wsHttpBinding (上面的代码),它返回“响应消息的内容类型text/ html;charset=utf-8不匹配绑定的内容类型(application/soap+xml;charset=utf-8)。如果使用自定义编码器,请确保正确实现IsContentTypeSupported方法。响应的前1024字节是:”后面是表单身份验证html代码。
我不知道我必须使用什么绑定配置。
我使用SoapUI测试了服务消耗,并且在这两种环境中都可以工作,并且它使用身份验证工作,我只需要通知用户、密码,并且需要将“WSS-密码类型”请求配置更改为"PasswordText“(只通知用户和密码,我有”无法验证或授权的安全令牌“返回)。
很抱歉,我的英语不好,我不流利,如果我在问题类别或格式上犯了什么错误。
编辑:--我无法通过身份验证在环境中可视化文件。当我把地址跟在wsdl后面时,它给了我一个验证表单(一个来自集成InterSystems软件的表单),而不是wsdl。
--我使用SoapUI测试了服务消耗,并在这两种环境中都工作,并且对它使用了身份验证,我只需通知用户、密码,并且需要将“WSS-密码类型”请求配置更改为"PasswordText“(只通知用户和密码,我有”安全令牌无法通过身份验证或授权“的返回)。
为什么它不使用自动生成的类,只是通知用户和传递?有人有主意吗?什么绑定配置等效于SoapUI配置的“WSS-密码类型”等于"PasswordText"?(我想这就是为什么它不起作用的关键,如果我只是通知用户和密码)
编辑2:soap消息的正文没有问题。我在做头球有困难。可能是这样的:
<soapenv:Header> <wsse:Security soapenv:mustUnderstand="1" xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd"> <wsse:UsernameToken wsu:Id="UsernameToken-5"> <wsse:Username>USERNAME</wsse:Username> <wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">PASSWORD</wsse:Password> <wsse:Nonce EncodingType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary">E1XqZ2v8IDaTBzfF3j/TOA==</wsse:Nonce> <wsu:Created>2012-12-21T12:24:23.380Z</wsu:Created> </wsse:UsernameToken> </wsse:Security> </soapenv:Header>
正如我告诉过的,我不能访问服务器,它是在我的客户那里。我只知道它是用java制造的。
发布于 2013-01-04 16:54:15
我必须手动发出一个http xml请求,并且必须手动创建xml并将其传递给request。postData变量来自手动创建的xml。
Dim byteArray As Byte() = Encoding.UTF8.GetBytes(postData)
Dim req As HttpWebRequest = DirectCast(WebRequest.Create("http://site.customer/ens/qa/customer.bs.ws.service.cls"), HttpWebRequest)
req.Method() = "POST"
req.UserAgent = "Apache-HttpClient/4.1.1 (java 1.5)"
req.ContentType = "text/xml;charset=UTF-8"
req.ContentLength = byteArray.Length
req.KeepAlive = True
req.Host = "site.customer"
req.AutomaticDecompression = 3
req.Headers.Add("SOAPAction", "http://www.tempuri.org/customer.bs.ws.service.function")发布于 2012-12-14 18:14:06
首先,您应该检查客户端是否使用与服务器相同的绑定。例如,如果您的客户端使用wsHttpBinding,但指向一个使用basicHttpBinding的服务,那么它几乎在所有情况下都会出错。
其次,您将安全模式设置为none,这意味着它不会使用传输或消息安全,我认为这不是您想要的。如果你想用
<transport clientCredentialType="Basic" proxyCredentialType="None" realm=""/>和
<message clientCredentialType="UserName" algorithmSuite="Default"/>然后,您应该将安全模式设置为TransportWithMessageCredential。这将使用HTTPS的传输安全性和用于身份验证的消息安全性。其他安全模式将只使用其中一个clientCredentialType (传输将使用传输clientCredentialType,消息将使用消息clientCredentialType)。
希望这有帮助:)。
https://stackoverflow.com/questions/13883082
复制相似问题