1

ここにすべての投稿があると、これは簡単に理解できると思うでしょう。:| さて、ここに簡単な例があります。注 Web サービスは VB で、クライアントは c# です。wb サービスは、JQuery から呼び出されると正常に送受信されます。.NET から問題があります。サービスが以下に示すようにパラメーターを要求すると、クライアントの getresponse メソッドがエラー 500 内部サーバー エラーを取得します。

ウェブサービス

<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

Web クライアント (JSON を送受信するように設定)

    public Person Test(int UserID, string url) {
        HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(url + "test.asmx/Test");
        webRequest.Method = "POST";
        webRequest.ContentType = "application/json; charset=utf-8";
        StreamWriter sw = new StreamWriter(webRequest.GetRequestStream());
        sw.Write("{'WebInfo':{'WebUserID':1}}");  // this works from JQuery
        HttpWebResponse webResponse = (HttpWebResponse)webRequest.GetResponse();
        Stream responseStream = webResponse.GetResponseStream();
        DataContractJsonSerializer jsonSerializer = new DataContractJsonSerializer(typeof(Person));
        Person someone = (Person)jsonSerializer.ReadObject(responseStream);
        return someone;
    }

誰かがこれを成功させましたか?ありがとう

4

1 に答える 1

3

これは、JSON Webサービスを呼び出して、開発者が複雑なデータ型を送受信できるようにするメソッドです。渡されるオブジェクトは、任意のデータ型またはクラスにすることができます。結果は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;
}

それが誰かを助けることを願っています

于 2012-05-14T14:41:46.350 に答える