繁体   English   中英

使用POST和JSON调用ASP.NET Web服务时出错

[英]Error Calling ASP.NET Web Service Using POST and JSON

我在这上面拉头发。 我无法使用POST和JSON成功调用.NET Web服务(“远程服务器返回错误:(500)内部服务器错误。”)。 如果我不坚持使用JSON或使用GET,则可以使其工作。 我在Xamarin Studio中进行所有操作,因此Web服务器是XSP,而不是IIS,如果有区别的话。

任何帮助深表感谢。

这是我的Web服务的代码:

using System;
using System.Web;
using System.Web.Services;
using System.Web.Script.Services;
using System.Web.Script.Serialization;

namespace WebServiceTest
{
    [WebService (Namespace = "http://tempuri.org/WebServiceTest")]
    [ScriptService]
    public class API : System.Web.Services.WebService
    {

        [WebMethod]
        [ScriptMethod (UseHttpGet=true, ResponseFormat=ResponseFormat.Json)]
        public string About() {
            return "About WebServiceTest";
        }

    }
}

...这是我的web.config ...

<?xml version="1.0"?>
<!--
Web.config file for WebServiceTest.

The settings that can be used in this file are documented at 
http://www.mono-project.com/Config_system.web and 
http://msdn2.microsoft.com/en-us/library/b5ysx397.aspx
-->
<configuration>
  <system.web>
    <webServices>
      <protocols>
        <add name="HttpGet" />
        <add name="HttpPost" />
      </protocols>
    </webServices>
    <compilation defaultLanguage="C#" debug="true">
      <assemblies>
      </assemblies>
    </compilation>
    <customErrors mode="RemoteOnly">
    </customErrors>
    <authentication mode="None">
    </authentication>
    <authorization>
      <allow users="*" />
    </authorization>
    <httpHandlers>
    </httpHandlers>
    <trace enabled="false" localOnly="true" pageOutput="false" requestLimit="10" traceMode="SortByTime" />
    <sessionState mode="InProc" cookieless="false" timeout="20" />
    <globalization requestEncoding="utf-8" responseEncoding="utf-8" />
    <pages>
    </pages>
  </system.web>
</configuration>

...这是我的应用程序测试代码...

using System;
using System.IO;
using System.Net;
using System.Text;

namespace WebServiceTestApp
{
    class MainClass
    {
        public static void Main (string[] args)
        {
            Console.WriteLine ("Starting...");

            Console.WriteLine ("Making API call...");
            string url = "http://127.0.0.1:8080/API.asmx/About";
            HttpWebRequest request;

            // Test 1: Use GET, don't set content type or content
            // Works, returns XML
            Console.WriteLine ("Test 1");
            request = (HttpWebRequest)WebRequest.Create (url);
            GetResponse (request);

            // Test 2: Use GET, set content type but no content
            // Works, returns JSON
            Console.WriteLine ("Test 2");
            request = (HttpWebRequest)WebRequest.Create (url);
            request.ContentType = "application/json; charset=utf-8";
            GetResponse (request);

            // Test 3: Use POST, don't set content type or content
            // Works, returns XML
            Console.WriteLine ("Test 3");
            request = (HttpWebRequest)WebRequest.Create (url);
            request.Method = "POST";
            GetResponse (request);

            // Test 4: Use POST, set content type but no content
            // *** Fails: 500 Internal Server Error
            Console.WriteLine ("Test 4");
            request = (HttpWebRequest)WebRequest.Create (url);
            request.ContentType = "application/json; charset=utf-8";
            request.Method = "POST";
            GetResponse (request);

            // Done.
            Console.WriteLine ("Done!");

        }

        public static void GetResponse(HttpWebRequest request)
        {
            try {
                using (var response = (HttpWebResponse)request.GetResponse ()) {
                    var stream = response.GetResponseStream ();
                    var reader = new StreamReader (stream);
                    var result = reader.ReadToEnd ();
                    Console.WriteLine (result);
                    reader.Close ();
                    reader.Dispose ();
                    response.Close ();
                }
            } catch (Exception e) {
                Console.WriteLine ("*** Failed: Error '" + e.Message + "'.");
            }
        }

    }
}

如果我尝试向POST请求添加任何内容,即用...替换Test 4代码,则测试也将失败。

    // Test 4: Use POST, set content type and content
    // *** Fails: 500 Internal Server Error
    Console.WriteLine ("Test 4");
    request = (HttpWebRequest)WebRequest.Create (url);
    request.Method = "POST";
    request.ContentType = "application/json; charset=utf-8";
    var paramData = ""; // also fails with "{}"
    request.ContentLength = paramData.Length;
    using (var writer = new StreamWriter (request.GetRequestStream ())) {
        writer.Write (paramData);
    }
    GetResponse (request);

如果我在ScriptMethod中更改“ UseHttpGet = false”,它也会失败。

我解决了自己的问题。 使用XSP和IISExpress(我没有尝试过任何其他Web服务器)时,您不能对contentType =“ application / json”的同一个WebMethod进行GET和POST。 (是的,我知道,我什至不应该尝试...)也就是说,如果您包含“(UseHttpGet = true”,则可以获取该方法,但不能进行POST,并且如果不包含该参数,则可以进行POST。有趣的是,如果您未设置内容类型(例如,您愿意使用XML),则GET和POST都可以工作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM