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

问题描述:

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

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

我可以在本地运行Web服务,当我在浏览器上的方法点击,我可以看到它处理HTTP POST请求,并接受ARGS =字符串,因为我的Web方法的签名接受一个字符串参数命名参数。然后,我使用下面的代码通过一个测试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

你应该首先看错误细节,启用细节显示。你是否在调试模式下尝试了解错误发生的位置? – Artemiy 2010-11-15 15:05:23

+1

是的,我在德鲁模式下使用,asp.net应用程序发送请求和Web服务接收。但它并没有进入调试,假定因为参数不匹配。 – Neil 2010-11-15 15:09:38

+0

您可否复制您的网络服务方法的签名?我刚创建了一个测试服务,用你发布的代码向它发出了一个请求,并且它工作正常。 – 2010-11-15 16:47:40

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

尝试使用代码显示在下面的链接,以创建您的要求:

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

或者probabily响应不包含Unicode字符值

尝试复制并粘贴此代码得到回应

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(); 
+1

这正是我如何构建它,除了我使用'使用'关键字,所以我不需要关闭我的流。 – Neil 2010-11-15 15:46:41

+0

我编辑了我的答案 – 2010-11-15 16:56:35

+0

我应该说,在下面的语句运行时,它会在第二条使用语句中出现。 – Neil 2010-11-16 09:28:48

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

就你而言,你似乎有一个“asmx网络服务”,所以我建议你在Visual Studio中为你添加一个“web引用”项目。这假设你正在使用visual studio。

添加此Web引用后,您可以通过“新建”来创建客户端。您可以在此客户端上执行任何Web方法。这是使用Web服务最简单的方法。你不必处理任何http复杂问题。

希望这会有所帮助。