我正在把头发拉出来。我无法使用 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”,它也会失败。