HttpClient.PostAsync未被识别的响应

4
如果我在Windows机器上运行我的Web应用程序,一切都正常。但是当我在Linux(CentOS)机器上运行此应用程序时,尝试发送Post请求时会出现以下异常:
System.Net.Http.HttpRequestException:服务器返回了无效或无法识别的响应。在System.Net.Http.CurlResponseHeaderReader.ReadHeader(String&headerName,String&headerValue)中。在System.Net.Http.CurlHandler.MultiAgent.CurlReceiveHeadersCallback(IntPtr buffer,UInt64 size,UInt64 nitems,IntPtr context)中结束前一个位置引发异常的堆栈跟踪---。在System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)中,等待任务的处理非成功和调试器通知。在System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)中。
这是使Post调用的代码:
    Uri uri = new Uri(ServiceConfiguration.SERVICE_URL);

    string sSOAPResponse = String.Empty;

    HttpClient hc = new HttpClient();

    hc.DefaultRequestHeaders.Add("SOAPAction", oRequest.Action);

    var content = new StringContent(oRequest.RequestMessage, Encoding.UTF8, "text/xml");

    try
    {
        using (HttpResponseMessage response = await hc.PostAsync(uri, content))
        {

            sSOAPResponse = await response.Content.ReadAsStringAsync();
            (...)
         }

我猜测这是因为我的头文件定义导致的。我也尝试在Linux控制台上使用curl进行请求,并且得到了预期的响应。我的头文件定义有问题吗?
使用CURL命令示例成功(

curl --header "Content-Type: text/xml;charset=UTF-8" --header "SOAPAction: ACTION_YOU_WANT_TO_CALL" --data @FILE_NAME URL_OF_THE_SOAP_WEB_SERVICE_ENDPOINT

SOAP UI请求(原始):

POST http://xxx/xxx/xxx.php HTTP/1.1 Accept-Encoding: gzip,deflate Content-Type: text/xml;charset=UTF-8 SOAPAction: "http://xxx/xxx/xxx.php/userLogin" Content-Length: 488 Host: xxx Connection: Keep-Alive User-Agent: Apache-HttpClient/4.1.1 (java 1.5


有时会出现网页返回或 SOAP 包的编码错误的情况。(SOAP 表示 UTF8 但内容是 ANSI) - Simon O'Doherty
首先感谢您的评论。我有没有办法检查无效的响应?好吧,在Windows机器上运行良好,如果我使用UTF-8编码在命令行中调用它也可以正常工作。 - Ricardo Mota
我通常使用SOAPUI来诊断SOAP问题。您可以检查原始的SOAP消息。 - Simon O'Doherty
我已经完成了这个操作,一切似乎都很正常(编辑后的带有SOAPUI原始数据的帖子)。 - Ricardo Mota
检查SOAP消息内容。 - Simon O'Doherty
1个回答

2

大家好,我已经解决了这个问题,感谢GitHub上的DNX团队。我在这个链接上创建了一个帖子来说明这个问题。

以下是我的操作步骤:

  • 我在我的CentOS服务器上运行了一个PHP(NuSOAP)API,并发送了一个命令,显示了PHP头信息。

[root@su soaptest]# curl -I http://application.com/api/service.php

HTTP/1.1 200 OK Date: Tue, 07 Jun 2016 01:21:20 GMT Server: Apache/2.4.6 (CentOS) X-Powered-By: PHP/5.4.16 Access-Control-Allow-Headers: SOAPAction,Content-Type Access-Control-Allow-Origin: * Access-Control-Allow-Methods : POST,GET,OPTIONS Connection: close Content-Type: text/html; charset=utf-8

问题出在我的主PHP API页面(我的情况是service.php)上找到的冒号(:)的空格。

Access-Control-Allow-Methods : POST,GET,OPTIONS

应该是:

Access-Control-Allow-Methods: POST,GET,OPTIONS

显然,(你可以在上面的链接中查看整个问题),如果你在Windows机器上运行应用程序,这个问题仍然会正确读取头信息(有或没有空格)。他们现在已经创建了一个问题,所以这也可能在Linux机器上发生。

谢谢。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接