.NET Web服务接收HTTP POST请求(500)内部服务器错误

时间:2010-11-15 14:57:39

标签: c# asp.net web-services http-post

我目前正在编写一个C#Web服务,它有几种方法,其中一种方法必须接收HTTP POST请求。我做的第一件事是改变web服务项目中的web.config文件,如下所示。

<webServices>
  <protocols>
    <add name="HttpSoap"/>
    <add name="HttpPost"/>
    <add name="HttpPostLocalhost"/>
    <add name="Documentation"/>
  </protocols>
</webServices>

我可以在本地运行Web服务,当我在浏览器中单击该方法时,我可以看到它处理HTTP POST请求并接受args = string,因为我的Web方法签名接受一个名为args的字符串参数。然后我使用下面的代码通过测试ASP.NET应用程序测试它,以触发HTTP POST请求。

HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(ConfigurationManager.AppSettings["PaymentHubURL"].ToString());

request.KeepAlive = false;
request.ContentType = "application/x-www-form-urlencoded";
request.Method = "POST";

StringBuilder sb = new StringBuilder();
sb.Append("message_type=");
sb.Append(HttpUtility.UrlEncode("Txn_Response"));

byte[] bytes = UTF8Encoding.UTF8.GetBytes(sb.ToString());
request.ContentLength = bytes.Length;
using (Stream postStream = request.GetRequestStream())
{
    postStream.Write(bytes, 0, bytes.Length);
}

string test;
using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
{
     StreamReader reader = new StreamReader(response.GetResponseStream());

     test = reader.ReadToEnd();
}

但是当我运行这个时,我得到“远程服务器返回错误:(500)内部服务器错误”。如果我删除参数,通过删除stringbuilder和字节代码,以及在Web服务中没有参数,它的工作原理。所以这显然是参数的问题。我实际上想要发送更多数据,并在Web服务中使用string []参数,但这也失败了。

任何人都可以帮忙吗?

2 个答案:

答案 0 :(得分:2)

我建议你重新考虑你的方法。微软已经编写了非常棒的用于使用Web服务的库,但有两种方法可以实现 - “添加Web引用”和“添加服务引用”。

在您的情况下,似乎您有一个“asmx Web服务”,所以我建议您在visual studio中为您的项目添加“Web引用”。这假设您正在使用visual studio。

添加此Web引用后,您可以通过“new”创建客户端。您可以在此客户端上执行任何Web方法。这是使用Web服务的最简单方法。您不必处理任何http并发症。

希望这会有所帮助。

答案 1 :(得分:0)

我猜你错误地构建了HttpPost请求。

尝试使用以下链接中显示的代码来创建您的请求:

http://msdn.microsoft.com/en-us/library/debx8sh9.aspx

或者可能是响应不包含unicode char值

尝试复制并粘贴此代码以获取响应

 System.Text.Encoding encode = System.Text.Encoding.GetEncoding("utf-8");
    StreamReader objSR;

webResponse = (HttpWebResponse)response.GetResponse();
StreamReader reader = webResponse.GetResponseStream();
objSR = new StreamReader(objStream, encode, true);
sResponse = objSR.ReadToEnd();