我正在使用一个简单的.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服务器错误。消息。
答案 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请求。
您可以选择以下几个选项:
如果您在Url上处理基于用户的输入(如网络浏览器),后一选项将是理想的,因为您不知道用户希望您的程序去哪里。