WebScriptEnablingBehavior
をWCF RESTサービスで利用して、JavaScriptクライアントプロキシ(およびそれに付随する厳密に型指定されたオブジェクト)を生成する機能を提供したいと考えています。
GET
とclient.DownloadData()
メソッド(パラメータはクエリ文字列として渡されます)ではうまく動作しますが、POST
とclient.UploadData(...)
で動作するように苦労しています。WCFサービスのWebScriptEnablingBehaviorがPOSTメソッドで動作しない
問題は、パラメータがサービスメソッドでnullになってしまうことです(エラー/例外なし、私はそれを使ってデバッグできます...ただnullです)。
web.config
ファイル
<services>
<service behaviorConfiguration="ServiceBehavior" name="ServWS_Main_2.WS_Main_2">
<endpoint address="" behaviorConfiguration="JSONOnly" binding="webHttpBinding"
bindingConfiguration="StreamedRequestWebBinding" contract="ServWS_Main_2.IServWS" />
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior name="ServiceBehavior">
<serviceMetadata httpGetEnabled="true"/>
<serviceDebug includeExceptionDetailInFaults="false"/>
</behavior>
</serviceBehaviors>
<endpointBehaviors>
<behavior name="JSONOnly">
<enableWebScript/>
</behavior>
</endpointBehaviors>
</behaviors>
サービス契約
[ServiceContract]
public interface IServWS
{
[OperationContract]
[WebInvoke(Method = "POST")]
ProviderInfo AddTo(string serviceName, BubbleInfo bubble);
}
実装パラメータとして渡された複合型の
public class WS_Main_2 : IServWS
{
public ProviderInfo AddTo(string serviceName, BubbleInfo bubble)
{
// at this point both serviceName and bubble are null
}
}
定義
[DataContract]
public class BubbleInfo
{
[DataMember(EmitDefaultValue = false)]
public string Text { get; set; }
[DataMember(EmitDefaultValue = false)]
public string Caption { get; set; }
}
私が代わりにWebScriptEnablingBehavior
が、webHttp
とURITemplate
を使用しない場合は、それが正常に動作することをクライアント
BubbleInfo bub = new BubbleInfo() { Text = "test2" };
MemoryStream stream = new MemoryStream();
DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(BubbleInfo));
serializer.WriteObject(stream, bub);
var url = GetURL() + "/addto?serviceName=MyService";
byte[] data = client.UploadData(url, "POST", stream.ToArray());
ノートからのコール。
Visual StudioビルトインWebサーバーとIIS Express 7.5でテスト済みです。
ありがとうございました。
私の問題は「アンラップされた」JSONメッセージであるとも思っています。また、WebScriptEnablingBehaviorはASP.NET Ajaxから使用されるようになっており、.NET C#プログラムからサービスをテストしていたため、その理由が分かりました。私はすべての異なるボディスタイルを無駄にしようとしました(同じ結果またはサービスは開始しません)。 – BlazingFrog
これは非常に奇妙です...サービス側で起こるエラー/トレースの詳細はありますか?完全なトレースとデバッグを有効にし、includeExceptionDetailInFaultsの設定を行い、何が起こるかを見てみましょう。 –