Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在ASP.net web服务和ASP.net web客户端之间发送和接收JSON时出现问题_Asp.net_Json_Web Services - Fatal编程技术网

在ASP.net web服务和ASP.net web客户端之间发送和接收JSON时出现问题

在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

你可能会认为,在这里的所有帖子中,这很容易理解这是一个简单的例子。注意web服务是VB,客户端是c#。wb服务在从JQuery调用时发送和接收fine。从.NET来看,有一个问题, 如果服务请求如下所示的参数,那么客户端的getresponse方法将获得error 500 Internal server error

Web服务

<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;
}