我正在尝试连接到https网络服务(据我所知,不是.NET)。 我无法以任何方式控制对方,我只是有一些标准和一个wsdl来操作 用它。
我首先使用“添加服务引用”创建了客户端,尝试了一些事情,直到遇到一些问题,其中一个最严重的问题是我无法将“身份验证”标头添加到导致失败的消息中。
使用旧的添加Web引用添加了服务,似乎更容易管理和适当,使用部分类并覆盖GetWebRequest,我添加了此代码,以便我可以预先验证服务并添加安全头,但他们没有在wsdl链接中提到。我知道服务不是强制要求告诉我的,但我的Web服务创建者同事们会很好。
protected override WebRequest GetWebRequest(Uri uri)
{
HttpWebRequest request = (HttpWebRequest)base.GetWebRequest(uri);
if (PreAuthenticate)
{
NetworkCredential networkCredentials = Credentials.GetCredential(uri, "Basic");
if (networkCredentials != null)
{
byte[] credentialBuffer = new UTF8Encoding()
.GetBytes(networkCredentials.UserName + ":" + networkCredentials.Password);
request.Headers["Authorization"] = "Basic" + Convert.ToBase64String(credentialBuffer);
}
else
{
throw new ApplicationException("No network credentials");
}
}
return request;
}
要调用该服务,我添加了以下代码:
using (Service client = new Service()) // autogenerated Service class
{
client.EnableDecompression = true;
// Create the network credentials and assign
// them to the service credentials
NetworkCredential netCredential = new NetworkCredential("test1", "test1");
Uri uri = new Uri(client.Url);
ICredentials credentials = netCredential.GetCredential(uri, "Basic");
client.Credentials = credentials;
// Be sure to set PreAuthenticate to true or else
// authentication will not be sent.
client.PreAuthenticate = true;
// Make the web service call.
Request req = new Request { UserName = "test2", Password = "test2"; // an object created from autogenerated code
RequestResult result = client.processMessage(req); // autogenerated code
}
在测试此调用并使用fiddler检查我的请求时。我看到2个呼叫使用这些标头保持呼叫,没什么特别的。
CONNECT server:443 HTTP/1.1
Host: server
Connection: Keep-Alive
发送570返回200结果。
HTTP/1.1 200 Connection Established
FiddlerGateway: Direct
StartTime: 00:05:13.743
Connection: close
数据发送571的调用导致500错误:
POST /host/Service HTTP/1.1
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; MS Web Services Client Protocol 2.0.50727.5448)
Authorization: BasicdXNlcOTc3MzQyMGTDFTR4dftfrdg5 // changed this hash for security reasons
VsDebuggerCausalityData: // Removed this hash for security reasons
Content-Type: text/xml; charset=utf-8
SOAPAction: ""
Host: server-host-url
Content-Length: 7238
Expect: 100-continue
Accept-Encoding: gzip
Connection: Keep-Alive
.NET客户端中的错误异常:
Error on verifying message against security policy Error code:1000
如您所见,存在Authorization标头。我也试过在Basic之后添加一个空格,你可以在上面看到完全在overriden方法中,并且似乎fiddler更好地识别它并且还解码了用户名:密码标题。
这导致了回应:
HTTP/1.1 500 Internal Server Error
Date: Sat, 21 Apr 2012 21:05:22 GMT
Server: Oracle-Application-Server-11g
X-Powered-By: Servlet/2.5 JSP/2.1
X-Cnection: close
Transfer-Encoding: chunked
Content-Type: text/xml;charset="utf-8"
Content-Language: en
X-Pad: avoid browser bug
Set-Cookie: BIGipServerpoolXoas243_254_9999=437682499.99988.0000; path=/
我首先想知道的奇怪的事情是,如果第一次调用应该预先验证,那么握手会保持活力吗?我知道这个500错误导致身份验证标头不存在,但我的错误。预身份验证是我需要知道它应该如何发生的事情,如果它出现在第一条消息中,我认为它不起作用。
另一件奇怪的事情是,如果我更改了两对密码,我会在小提琴手上看到我得到3条消息,1条带有握手,结果为200条,“TWO”则另外有401条授权。
这让我发疯。任何帮助都能帮助我拯救我的灵魂。
谢谢!