【问题标题】:.NET Web Service receive HTTP POST request (500) Internal Server Error.NET Web 服务接收 HTTP POST 请求 (500) 内部服务器错误
【发布时间】:2010-11-15 14:57:38
【问题描述】:

我目前正在编写一个 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) 内部服务器错误”。如果我删除参数,通过删除字符串生成器和字节码,以及在 Web 服务中没有参数,它可以工作。所以很明显是参数有问题。我实际上想发送更多数据,并且在 Web 服务中使用了 string[] 参数,但这也失败了。

谁能帮忙??

【问题讨论】:

  • 您应该先查看错误详细信息,启用详细显示。您是否在调试模式下尝试过这个以查看错误发生的位置?
  • 是的,我在 deug 模式下使用,asp.net 应用程序发送请求和 Web 服务接收。但是没有进入调试,估计是因为参数不匹配。
  • 能否请您复制您的网络服务方法的签名?我刚刚创建了一个测试服务,使用您发布的代码向它发出了请求,它工作正常。
  • [WebMethod] 公共字符串 IssueTransactionResponse(string args) {
  • 我也试过 [WebMethod] public string IssueTransactionResponse(string args) {

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


【解决方案1】:

我建议您重新考虑您的方法。 Microsoft 为使用 Web 服务编写了非常棒的库,但有两种方法可以做到这一点 - “添加 Web 引用”和“添加服务引用”。

在您的情况下,您似乎有一个“asmx Web 服务”,所以我建议您在 Visual Studio 中为您的项目添加一个“Web 引用”。这是假设您使用的是视觉工作室。

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

希望这会有所帮助。

【讨论】:

    【解决方案2】:

    我猜你是在错误地构建 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();
    

    【讨论】:

    • 这正是我构建它的方式,除了我使用'using'关键字,所以我不需要关闭我的流。
    • 我应该说,当运行以下语句时,它会落在第二个 using 语句上。
    • HttpWebResponse 响应 = (HttpWebResponse)request.GetResponse()
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-06
    • 1970-01-01
    相关资源
    最近更新 更多