在ASP.net web服务和ASP.net web客户端之间发送和接收JSON时出现问题
你可能会认为,在这里的所有帖子中,这很容易理解这是一个简单的例子。注意web服务是VB,客户端是c#。wb服务在从JQuery调用时发送和接收fine。从.NET来看,有一个问题, 如果服务请求如下所示的参数,那么客户端的getresponse方法将获得error 500 Internal server error Web服务在ASP.net web服务和ASP.net web客户端之间发送和接收JSON时出现问题,asp.net,json,web-services,Asp.net,Json,Web Services,你可能会认为,在这里的所有帖子中,这很容易理解这是一个简单的例子。注意web服务是VB,客户端是c#。wb服务在从JQuery调用时发送和接收fine。从.NET来看,有一个问题, 如果服务请求如下所示的参数,那么客户端的getresponse方法将获得error 500 Internal server error Web服务 <WebMethod()> _ <ScriptMethod(ResponseFormat:=ResponseFormat.Json, XmlSerial
<WebMethod()> _
<ScriptMethod(ResponseFormat:=ResponseFormat.Json, XmlSerializeString:=False)> _
Public Function Test(WebInfo As GetUserID) As Person
Dim Someone As New Person
Someone.Name = "Bob"
Someone.FavoriteColor = "Green"
Someone.ID = WebInfo.WebUserID.ToString()
Return Someone
End Function
有人成功地做到了吗?
感谢这里有一个调用JSON web服务的方法,允许开发人员发送和接收complext数据类型。传入的对象可以是任何数据类型或类。结果是一个JSON字符串,或者方法类型的任何错误消息如下所示
public class WebServiceCallReturn {
public string JSONResponse { get; set; }
public string SimpleResponse { get; set; }
public string Error { get; set; }
}
public WebServiceCallReturn WebServiceJSONCall(string uri, string requestType, object postData = null) {
WebServiceCallReturn result = new WebServiceCallReturn();
// create request
HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(uri);
webRequest.ContentType = "application/json; charset=utf-8";
webRequest.Method = requestType;
webRequest.Accept = "application/json; charset=utf-8";
// add json data object to send
if (requestType == "POST") {
string json = "{ }";
if (postData != null) {
try { // the serializer is fairly robust when used this way
DataContractJsonSerializer ser = new DataContractJsonSerializer(postData.GetType());
MemoryStream ms = new MemoryStream();
ser.WriteObject(ms, postData);
json = Encoding.UTF8.GetString(ms.ToArray());
} catch {
result.Error = "Error serializing post";
}
}
webRequest.ContentLength = json.Length;
StreamWriter sw;
try {
sw = new StreamWriter(webRequest.GetRequestStream());
} catch (Exception ex) {
// the remote name could not be resolved
result.Error = ex.Message;
return result;
}
sw.Write(json);
sw.Close();
}
// read response
HttpWebResponse webResponse;
try {
webResponse = (HttpWebResponse)webRequest.GetResponse();
} catch (Exception ex) {
// The remote server returned an error...
// (400) Bad Request
// (403) Access forbidden (check the application pool)
// (404) Not Found
// (405) Method not allowed
// (415) ...not the expected type
// (500) Internal Server Error (problem with IIS or unhandled error in web service)
result.Error = ex.Message;
return result;
}
Stream responseStream = webResponse.GetResponseStream();
StreamReader sr = new StreamReader(responseStream, Encoding.UTF8);
string resultString = sr.ReadToEnd();
sr.Close();
responseStream.Close();
result.JSONResponse = resultString;
return result;
}
此方法可按如下方式使用
public SomeCustomDataClass Getsomeinformation(int userID) {
UserInfoClass postData = new UserInfoClass();
postData.WebUserID = userID;
SomeCustomDataClass result = new SomeCustomDataClass();
string uri = URL + "SomeServices.svc/GetSomething";
WebServiceCallReturn webReturn = WebServiceJSONCall(uri, "POST", postData);
if (webReturn.Error == null) {
//resultString = CleanJSON(resultString);
JavaScriptSerializer serializer = new JavaScriptSerializer();
try {
result = serializer.Deserialize<SomeCustomDataClass>(webReturn.JSONResponse);
} catch {
result.Error = "Error deserializing";
}
} else {
result.Error = webReturn.Error;
}
return result;
}
public SomeCustomDataClass Getsomeinformation(int-userID){
UserInfoClass postData=新的UserInfoClass();
postData.WebUserID=userID;
SomeCustomDataClass结果=新的SomeCustomDataClass();
字符串uri=URL+“SomeServices.svc/GetSomething”;
WebServiceCallReturn webReturn=WebServiceJSONCall(uri,“POST”,postData);
if(webReturn.Error==null){
//resultString=CleanJSON(resultString);
JavaScriptSerializer serializer=新的JavaScriptSerializer();
试一试{
结果=序列化程序.反序列化(webReturn.JSONResponse);
}抓住{
result.Error=“反序列化错误”;
}
}否则{
result.Error=webReturn.Error;
}
返回结果;
}
希望这对某人有所帮助我有一个解决方案,稍后将发布。解决方案包括1)使用DatacontractJsonSerializer在WCF服务中使用WebMessageBodyStyle.Bare body样式序列化json 2),以避免包装json。3) 用户JavaScriptSerializer来反序列化响应stringOH,我猜第4项)从web服务切换到WCF服务,这就是第2项在其中的原因
public SomeCustomDataClass Getsomeinformation(int userID) {
UserInfoClass postData = new UserInfoClass();
postData.WebUserID = userID;
SomeCustomDataClass result = new SomeCustomDataClass();
string uri = URL + "SomeServices.svc/GetSomething";
WebServiceCallReturn webReturn = WebServiceJSONCall(uri, "POST", postData);
if (webReturn.Error == null) {
//resultString = CleanJSON(resultString);
JavaScriptSerializer serializer = new JavaScriptSerializer();
try {
result = serializer.Deserialize<SomeCustomDataClass>(webReturn.JSONResponse);
} catch {
result.Error = "Error deserializing";
}
} else {
result.Error = webReturn.Error;
}
return result;
}