[英]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.