web-dev-qa-db-ja.com

JSONをWCFRestサービスに送信する-オブジェクトは常にnullです

REST、WCF、JSON(これらすべてのテクノロジの新機能)を使用して、アプリケーションを機能させようとしています。 「GET」は正常に機能しています。私に問題を引き起こしているのは「POST」です。

以下に示すように、JSON.stringifyを使用してJSONを「パック」し、POSTをRESTリソースに送信します。ただし、オブジェクトがリクエストを処理しているWCFメソッドに到達すると、オブジェクトは常にnullになります。

コードは次のとおりです。

$.ajax({
    type: "POST",
    dataType: "json",
    url: "Services/ContactCompanyService.svc/contactcompanies/customers",
    contentType: "application/json; charset=utf-8",
    data: JSON.stringify({ contactcompany: newCustomer }),
    success: function (html) { alert(html); }
});

これが設定のものです:

<services>
  <service behaviorConfiguration="ServiceBehaviour" name="ContactCompanyService">
    <endpoint address="contactcompanies" behaviorConfiguration="web" binding="webHttpBinding" contract="IContactCompanyService"/>
  </service>

</services>

<behaviors>
  <endpointBehaviors>
    <behavior name="web">
      <webHttp/>
      <enableWebScript/>
    </behavior>
  </endpointBehaviors>
  <serviceBehaviors>
    <behavior name="ServiceBehaviour">
      <serviceMetadata httpGetEnabled="true"/>
      <serviceDebug includeExceptionDetailInFaults="false"/>
    </behavior>
    <behavior name="">
      <serviceMetadata httpGetEnabled="true"/>
      <serviceDebug includeExceptionDetailInFaults="false"/>
    </behavior>
  </serviceBehaviors>
</behaviors>
<serviceHostingEnvironment multipleSiteBindingsEnabled="true" aspNetCompatibilityEnabled="true"/>

契約は次のとおりです。

    [OperationContract]
    [WebInvoke(Method = "POST", RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Wrapped, UriTemplate = "customers")]
    [return: MessageParameter(Name = "ContactCompany")]
    ContactCompany AddContactCompany(ContactCompany ContactCompanyObject);

そして、ContactCompanyObjectがnullである上記のインターフェースを実装するメソッドです。

一体何が間違っているのですか?私の愚かさを排除しないでください。

さらに:WebMessageBodyStyleを.Bareに変更しました。これにより、オブジェクトはnullになりませんでしたが、オブジェクトのすべてのプロパティがnullになりました。そうは言っても、ラップは私が行きたい方法です。

私はどんな援助にも感謝するでしょう。さらに詳しい情報が必要な場合はお知らせください。

[〜#〜] update [〜#〜]

私は完全に新しいプロジェクトでゼロから始めました-取り除いて。

まったく同じ結果が得られます。WCFコードで受信したオブジェクトはnullです。

これが私がこの新しいテストプロジェクトでしたことです。

WCF契約:

(名前空間の下:NullTestService

[ServiceContract]
public interface IService1
{
    [OperationContract]
    [WebInvoke(Method = "GET", RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Wrapped, UriTemplate = "NullTestPost")]
    [return: MessageParameter(Name = "NullTestType")]
    NullTestType GettMethod();

    [OperationContract]
    [WebInvoke(Method = "POST", RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Wrapped, UriTemplate = "NullTestPost")]
    [return: MessageParameter(Name = "NullTestType")]
    NullTestType PostMethod(NullTestType NullTestTypeObject);
}

[DataContract]
public class NullTestType
{
    [DataMember]
    public string NullTestString { get; set; }
    [DataMember]
    public int NullTestInt { get; set; }
}

サービスの実装:(同じ名前空間)

    public class Service1 : IService1
{
    public NullTestType PostMethod(NullTestType NullTestTypeObject)
    {
        return NullTestTypeObject;
    }

    public NullTestType GettMethod()
    {
        return new NullTestType { NullTestString = "Returned String", NullTestInt = 25 };
    }

}

ウェブサイトプロジェクト。 Service.svc:

<%@ ServiceHost Service="NullTestService.Service1" %>

webプロジェクトのweb.config:

    <system.serviceModel>
<services>
  <service behaviorConfiguration="ServiceBehaviour" name="NullTestService.Service1">
    <endpoint address="nulltestaddress" behaviorConfiguration="web" binding="webHttpBinding" contract="NullTestService.IService1"/>
  </service>

</services>

<behaviors>
  <endpointBehaviors>
    <behavior name="web">
      <webHttp/>
    </behavior>
  </endpointBehaviors>
  <serviceBehaviors>
    <behavior name="ServiceBehaviour">
      <serviceMetadata httpGetEnabled="false" />
      <serviceDebug includeExceptionDetailInFaults="false"/>
    </behavior>
  </serviceBehaviors>
</behaviors>
</system.serviceModel>

そして最後に、WebプロジェクトのjQuery:

$(function () {


//        $.ajax({
//            type: "GET",
//            url: "http://localhost:8080/TestWeb/Service.svc/nulltestaddress/nulltestpost",
//            success: alertResult
//        });

alert('about to do it');

$.ajax({
    type: "POST",
    url: "http://localhost:8080/TestWeb/Service.svc/nulltestaddress/nulltestpost",
    dataType: "json",
    contentType: "application/json; charset=utf-8",
    data: '{"NullTestType":{"NullTestString":"This is a post string","NullTestInt":25}}',
    success: alertResult
});

});

function alertResult(data) {
        alert(data.NullTestType.NullTestString);
}

そう。 (コメントアウトされた)GETは正常に機能し、JSONを返します。 POSTはしません。次の行で:

public NullTestType PostMethod(NullTestType NullTestTypeObject)
{
    return NullTestTypeObject;
}

( 'return'行)NullTestTypeObjectは常にNULLです。

助けていただければ幸いです。私はこれで多くの時間を失いました。

16
GrayDS

Wrappedを実行する場合は、リクエストを操作パラメーター名でラップする必要があります。

var input = { "ContactCompanyObject" : newCustomer };
$.ajax({
   data: input
   ...
});

または、2番目の例では、ajax呼び出しを以下に示すものに変更すると、期待される結果が得られるはずです。

var input = { NullTestTypeObject: { NullTestString: "Hello", NullTestInt: 123} };
alert("Input: " + JSON.stringify(input));
$.ajax({
    type: "POST",
    url: "./Service1.svc/nulltestaddress/NullTestPost",
    contentType: "application/json",
    data: JSON.stringify(input),
    success: function (result) {
        alert("POST result: " + JSON.stringify(result));
    }
});
14
carlosfigueira