0

我正在把头发拉出来。我无法使用 POST 和 JSON 成功调用 .NET Web 服务(“远程服务器返回错误:(500) 内部服务器错误。”)。如果我不坚持使用 JSON 或使用 GET,我可以让它工作。我在 Xamarin Studio 中做这一切,所以 Web 服务器是 XSP 而不是 IIS,如果这有区别的话。

非常感谢任何帮助。

这是我的网络服务的代码:

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、请求中,测试也会失败,即将测试 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”,它也会失败。

4

1 回答 1

0

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

于 2015-12-10T02:46:40.417 回答