.NET服务响应500内部错误和“缺少参数”到HttpWebRequest POSTS但测试表格工作正常

时间:2013-01-03 20:19:49

标签: c# .net web-services httpwebrequest asmx

我正在使用一个简单的.NET服务(asmx),它可以在通过测试表单(POST)调用时正常工作。通过HttpWebRequest对象调用时,我收到WebException“System.Net.WebException:远程服务器返回错误:(500)内部服务器错误。”深入挖掘,阅读WebException.Response.GetResponseStream()我收到消息:“缺少参数:serviceType”。但我清楚地包括了这个参数。

我在这里不知所措,更糟糕的是我无法调试服务本身。

以下是用于发出请求的代码:

string postData = String.Format("serviceType={0}&SaleID={1}&Zip={2}", request.service, request.saleId, request.postalCode);
byte[] data = (new ASCIIEncoding()).GetBytes(postData);

HttpWebRequest httpWebRequest = (HttpWebRequest)WebRequest.Create(url);
httpWebRequest.Timeout = 60000;
httpWebRequest.Method = "POST";
httpWebRequest.ContentType = "application/x-www-form-urlencoded";
httpWebRequest.ContentLength =  data.Length;

using (Stream newStream = httpWebRequest.GetRequestStream())
{
    newStream.Write(data, 0, data.Length);
}

try
{
    using (response = (HttpWebResponse)httpWebRequest.GetResponse())
    {
        if (response.StatusCode != HttpStatusCode.OK)
            throw new Exception("There was an error with the shipping freight service.");

        string responseData;
        using (StreamReader responseStream = new      StreamReader(httpWebRequest.GetResponse().GetResponseStream(),    System.Text.Encoding.GetEncoding("iso-8859-1")))
        {
            responseData = responseStream.ReadToEnd();
            responseStream.Close();
        }

        if (string.IsNullOrEmpty(responseData))
            throw new Exception("There was an error with the shipping freight service.  Request went through but response is empty.");

        XmlDocument providerResponse = new XmlDocument();
        providerResponse.LoadXml(responseData);

        return providerResponse;
    }
}
catch (WebException webExp)
{
    string exMessage = webExp.Message;

    if (webExp.Response != null)
    {
        using (StreamReader responseReader = new StreamReader(webExp.Response.GetResponseStream()))
        {
            exMessage = responseReader.ReadToEnd();
        }
    }

    throw new Exception(exMessage);
}

任何人都知道可能会发生什么?

感谢。

更新

单步执行调试器,我看到参数是正确的。我也看到fiddler中的参数是正确的。

检查fiddler,每次执行此代码时,我会收到2个请求。第一个请求是发送参数的帖子。它获得301响应代码,其中包含“移动的文档移动对象此处可以找到此文档”消息。第二个请求是对没有正文的相同URL的GET。它因“缺少参数:serviceType”而出现500服务器错误。消息。

1 个答案:

答案 0 :(得分:0)

当您查看Fiddler中的请求时,您似乎发现了问题。摘自http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html

  

10.3.2 301永久移动

     

已为所请求的资源分配了一个新的永久URI,并且此资源的任何将来的引用应该使用返回的URI之一。具有链接编辑功能的客户端应尽可能自动将对Request-URI的引用重新链接到服务器返回的一个或多个新引用。

     

.....

     

注意:在自动重定向POST请求之后         接收301状态代码,一些现有的HTTP / 1.0用户代理         将错误地将其更改为GET请求。

您可以选择以下几个选项:

  1. 对程序进行硬编码以使用您在Fiddler的301响应中看到的新网址
  2. 调整代码以检索301响应,从响应中解析出新的Url,并使用新的Url构建新的响应。
  3. 如果您在Url上处理基于用户的输入(如网络浏览器),后一选项将是理想的,因为您不知道用户希望您的程序去哪里。