2012-04-25 15 views
1

WebScriptEnablingBehaviorをWCF RESTサービスで利用して、JavaScriptクライアントプロキシ(およびそれに付随する厳密に型指定されたオブジェクト)を生成する機能を提供したいと考えています。
GETclient.DownloadData()メソッド(パラメータはクエリ文字列として渡されます)ではうまく動作しますが、POSTclient.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が、webHttpURITemplateを使用しない場合は、それが正常に動作することをクライアント

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でテスト済みです。

ありがとうございました。

答えて

0

これは、リクエストメッセージの「ボディスタイル」に関係していると思います。実際にサービスが「ラップされた」メッセージ(一般にパラメータ名であるJSONの周りに余分なラッパーを持つ)を期待するときに、サービスに「裸の」JSONメッセージを送信している可能性があります。

注意する必要があるものtoはWebInvokeAttribute.BodyStyleプロパティです。サービス操作との間で送受信されるメッセージのボディスタイルを取得および設定します。属性が適用されたサービス操作と送受信される要求と応答をラップするかどうかを制御します。一般的に、返されたJSONは、クロスドメインで実行できるJavaScript関数でラップされているため、「裸の」ボディスタイルに切り替えることで削除する必要があります。

WebInvokeAttributeのBodyStyleプロパティをBareまたはWrappedに明示的に設定して再度実行するとどうなりますか?これで問題は解決しますか?私はそれがすべきだと思う!

+0

私の問題は「アンラップされた」JSONメッセージであるとも思っています。また、WebScriptEnablingBehaviorはASP.NET Ajaxから使用されるようになっており、.NET C#プログラムからサービスをテストしていたため、その理由が分かりました。私はすべての異なるボディスタイルを無駄にしようとしました(同じ結果またはサービスは開始しません)。 – BlazingFrog

+0

これは非常に奇妙です...サービス側で起こるエラー/トレースの詳細はありますか?完全なトレースとデバッグを有効にし、includeExceptionDetailInFaultsの設定を行い、何が起こるかを見てみましょう。 –

関連する問題