簡體   English   中英

如何通過 JSON 請求從提琴手調用 wcf 寧靜服務?

[英]how to call wcf restful service from fiddler by JSON request?

我是 wcf 寧靜服務的新手。 我找不到問題,為什么我的 wcf 寧靜服務給出“錯誤請求”。 我使用 .NET 4.0。

我的服務是:

[OperationContract(Name="Add")]
[WebInvoke(UriTemplate = "test/", Method = "POST",
          ResponseFormat=WebMessageFormat.Json,
          RequestFormat=WebMessageFormat.Json )]
public int Add(Number n1)
{
    res = Convert.ToInt32(n1.Number1) + Convert.ToInt32(n1.Number2);
    return res;
}

數據是..

[Serializable]
    public class Number
    {
        public int Number1 { get; set; }
        public int Number2 { get; set; }
    }

當我從提琴手調用時,它返回“HTTP/1.1 400 Bad Request”

我的提琴手請求 header 是:

User-Agent: Fiddler
Host: localhost:4217
Content-Type: application/json; charset=utf-8

請求正文是:

{"Number1":"7","Number2":"7"}

並且響應 header 是:

HTTP/1.1 400 Bad Request
Server: ASP.NET Development Server/10.0.0.0
Date: Sun, 14 Aug 2011 18:10:21 GMT
X-AspNet-Version: 4.0.30319
Content-Length: 5450
Cache-Control: private
Content-Type: text/html
Connection: Close

但是,如果我通過 C# 客戶端程序調用此服務就可以了。

我的客戶代碼是:

uri = "http://localhost:4217/Service1.svc/";
Number obj = new Number() { Number1 = 7, Number2 = 7 };
using (HttpResponseMessage response = new HttpClient().Post(uri+"test/",
       HttpContentExtensions.CreateDataContract(obj)))
{
    string res = response.Content.ReadAsString();
    return res.ToString();
}

請幫我........

謝謝。

找出代碼問題的方法是在服務器上啟用跟蹤,它會有一個解釋問題的異常。 我用你的代碼寫了一個簡單的測試,它有一個類似的錯誤(400),並且跟蹤有以下錯誤:

The data contract type 'WcfForums.StackOverflow_7058942+Number' cannot be
deserialized because the required data members '<Number1>k__BackingField,
<Number2>k__BackingField' were not found.

標有[Serializable]的數據類型序列化 object 中的所有字段,而不是屬性 通過注釋掉該屬性,代碼實際上運行良好(然后該類型屬於“POCO”(普通舊 Clr 對象)規則,該規則序列化所有公共字段和屬性。

public class StackOverflow_7058942
{
    //[Serializable]
    public class Number
    {
        public int Number1 { get; set; }
        public int Number2 { get; set; }
    }
    [ServiceContract]
    public class Service
    {
        [OperationContract(Name = "Add")]
        [WebInvoke(UriTemplate = "test/", Method = "POST", ResponseFormat = WebMessageFormat.Json, RequestFormat = WebMessageFormat.Json)]
        public int Add(Number n1)
        {
            int res = Convert.ToInt32(n1.Number1) + Convert.ToInt32(n1.Number2);
            return res;
        }
    }
    public static void Test()
    {
        string baseAddress = "http://" + Environment.MachineName + ":8000/Service";
        ServiceHost host = new ServiceHost(typeof(Service), new Uri(baseAddress));
        host.AddServiceEndpoint(typeof(Service), new WebHttpBinding(), "").Behaviors.Add(new WebHttpBehavior());
        host.Open();
        Console.WriteLine("Host opened");

        WebClient c = new WebClient();
        c.Headers[HttpRequestHeader.ContentType] = "application/json; charset=utf-8";
        c.Encoding = Encoding.UTF8;
        Console.WriteLine(c.UploadString(baseAddress + "/test/", "{\"Number1\":\"7\",\"Number2\":\"7\"}"));

        Console.Write("Press ENTER to close the host");
        Console.ReadLine();
        host.Close();
    }
}

您做錯的一件事是請求 object 的格式。 將其更改為:

{ n1: { "Number1":"7","Number2":"7"} }

參數名稱是 json object 傳遞給 wcf Z466DEEC76ECDF5FCA6D548571F633 端點的根屬性名稱。

我在 git 上有一個示例 wcf 服務 除此之外,它有一個 json 端點,在Default.asmx中我使用 jquery 來調用它。 我建議您構建一個類似的網頁(將其托管在與 WCF 服務相同的網站上),該網頁通過 jquery 調用您的 json 服務,並使用正在運行的提琴手的示例請求測試服務。 這將比自己構建請求更容易且更不容易出錯,因為 jquery 將處理 header 中的許多細節。

調用my echo服務的示例jquery ajax代碼如下:

    $("#btnEchoString").click(function () {
        var request = $("#request");
        var response = $("#response");
        $.ajax({
            url: 'EchoService.svc/JSON/Echo',
            type: "POST",
            contentType: "application/json; charset=utf-8",
            data: JSON.stringify({ request: request.val() }),
            dataType: "json",
            success: function (data) {
                response.val(data.d);
            },
            error: function (request, status, error) {
                //TODO: do something here
            }
        });
    });

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM