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です。
助けていただければ幸いです。私はこれで多くの時間を失いました。
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));
}
});