1

EntityFrameworkでサポートされているWCFデータサービスにPOSTしようとしていますが、次のようになります。

415 Unsupported Media Type

このガイドに従って、ヘッダーをjQueryPOSThttp ://blogs.msdn.com/b/astoriateam/archive/2012/04/11/what-happened-to-application-json-in-wcf-ds-に配置しました。 5-0.aspx

これらは私のヘッダーです:

POST /webservices/service/service.svc/Activities HTTP/1.1
Host: www.url.com
Connection: keep-alive
Content-Length: 138
Origin: http://www.url.com
X-Requested-With: XMLHttpRequest
MaxDataServiceVersion: 3.0
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.5 (KHTML, like Gecko) Chrome/19.0.1084.56 Safari/536.5
Content-Type: application/json; charset=UTF-8
Accept: application/json;odata=verbose
Referer: http://www.url.com/sites/site/
Accept-Encoding: gzip,deflate,sdch
Accept-Language: en-US,en;q=0.8,en-GB;q=0.6
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3

このサイトは、WCFDataServicesでのEntityFrameworkの使用に役立ちました-http: //blogs.msdn.com/b/writingdata_services/archive/2011/06/15/entity-framework-4-1-code-first-and-wcf-data -services.aspx

function AddActivity() {
    var activity = {
        activity:
            {
                "Title": "Test From Code",
                "Detail": "Code Example",
                "Started": "2012-06-21T09:00:00",
                "UserId": 17
            }
    };

    var url = 'http://www.url.com/webservices/service/service.svc/Activities';

    $.ajax({
        type: "POST",
        url: url,
        data: activity,
        dataType: "json",
        contentType: "application/json; charset=utf-8",
        beforeSend: function (xhr) {
            xhr.setRequestHeader("Accept", "application/json;odata=verbose");
            xhr.setRequestHeader("MaxDataServiceVersion", "3.0");
        },
        success: function (data) {
            alert('Success');
        },
        error: function (err) {
            alert('Fail\n' + err.statusText);
        }
    });
}

データを読み取ることができますJSONデータOK

4

2 に答える 2

1

WCF Data Services 5.0は、ペイロードのバージョンV3(DataServiceVersion)の場合、要求(または応答)ペイロードのアプリケーション/jsonコンテンツタイプをサポートしていません。上記の場合、DataServiceVersionを指定していません(ちなみに、これは常に必要です)。このような場合、サーバーは何らかの方法でバージョンを推測する必要があります。WCFデータサービスサーバーは、サーバーが理解できる最大バージョンを想定します。サーバー自体がV3を理解し、MaxDataServiceVersion:3.0を指定したため、クライアントもV3を理解し、ペイロードがV3ペイロードであると想定します。

V3ペイロードは現在application/jsonをサポートしておらず、application / json; odata=verboseのみをサポートしています。

詳細については、次のブログ投稿を参照してください:http: //blogs.msdn.com/b/astoriateam/archive/2012/04/11/what-happened-to-application-json-in-wcf-ds-5-0。 aspx。GETについて説明していますが、POSTなどにも同じことが当てはまります。

したがって、問題を修正するには、クライアントを変更して、DataServiceVersion:2.0(または1.0)を送信するか、Content-Type:application / json; odata = verboseを送信するように変更します(これは、ペイロードバージョン)。

于 2012-06-27T12:18:21.177 に答える
0

WCF Data ServicesコンポーネントなしでWCFを使用して、最小限のハッキングでこれを実行しました。

最小限のタイプをJSONとしてポストバックすると、値が自動マッピングされます(例:このJSON)

{
    "name": "1234567890",
    "amount": "2500.00"
}

このサービスにポストバックできます

[WebInvoke(Method = "POST", ResponseFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Bare, RequestFormat = WebMessageFormat.Json)]
public string MethodName(Message message)

ここで、MessageはC#クラスです。

public class Message
{
    public string name { get; set; }
    public string amount { get; set; }
}

ものすごく単純。次に、それをODataリクエストとして処理する場合は、より複雑なJSONが投稿されます(例(ODataV2))。

{
"d": [
    {
        "__metadata": {
            "id": "http://host:54470/ods.svc/MethodName('1234567890')",
            "uri": "http://host:54470/ods.svc/MethodName('1234567890')",
            "type": "SomeCompany.Helper.Services.RequestMessage.Message"
        },
        "name": "1234567890",
        "amount": "2500.00",
    }
]
}

対応するC#クラスを作成すると、このODataはそれらのクラスにマップされます。これらのクラスはODataで機能します。

public class Message
{
    public ODataResult[] d;
}

public class ODataResult
{
    public ODataMetaData __metadata;
    public string name { get; set; }
    public string amount { get; set; }
}

public class ODataMetaData
{
    public string id;
    public string uri;
    public string type;
}

jsonが投稿したODataは、このMessageクラスにマップされます。これにより、必要に応じて着信メッセージを「整形」する方法が提供されます。これは、場合によっては必要になる場合があります。

これがWCFDataServicesを使用するよりも優れていると言っているのではなく、単に機能すると言っているだけです。

于 2014-01-21T21:48:50.040 に答える