从.NET客户端调用Web服务时出现HTTP / 1.1 500内部服务器错误

时间:2012-04-21 21:29:07

标签: web-services c#-4.0 web-reference

我正在尝试连接到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条授权。

这让我发疯。任何帮助都能帮助我拯救我的灵魂。

谢谢!

0 个答案:

没有答案