0

一部のデータを返し、一部のデータをに投稿できるWCFサービスを作成しました。サービスの方法は以下の通りです。

    [OperationContract]
    bool UploadStream(Guid key, List<StreamRecord> values);

    [OperationContract]
    bool RegisterStream(Guid key);

    [OperationContract]
    StreamCollection GetStreams(Guid key);

これをRESTインターフェースで実装する必要があります。以下のように、新しいインターフェイスIRestServiceを作成しました

    [WebInvoke(
        Method = "GET",
        ResponseFormat = WebMessageFormat.Xml,
        UriTemplate = "/bitpool/{poolKey}/streams")]
    BitStreamCollection GetBitStreams(string poolKey);

正常に動作します(ブラウザのアドレスバーからテストでき、すべて問題ありません)

Uploadメソッドも実装したいのですが、どうすればいいのかわかりません。

    [WebInvoke(
        Method = "POST",
        RequestFormat = WebMessageFormat.Xml,
        ResponseFormat = WebMessageFormat.Xml,
        UriTemplate = "/stream/{streamKey}/records/{values}")]
    bool UploadStream(string streamKey, List<StreamRecordEntity> values);

しかし、ブラウザでサービスにアクセスしようとすると、エラーが発生します

http://localhost:6767/RestServer.svc/

エラーが発生します:

コントラクト'IRestServerJson'の操作'UploadBitStream'には、タイプ'string'を持たない'values'という名前のパス変数があります。UriTemplateパスセグメントの変数は、タイプ'string'である必要があります。

POSTの場合、そのようなURLを定義することはできないと思いますが、どうすればよいですか?

また、メソッドRegisterStreamは、キーを持つストリームが存在するかどうかを確認し、存在しない場合は作成してtrueを返し、存在しない場合はfalseを返します。

GET(結果を返す必要があるため)またはPUTまたはPOSTとして定義する必要がありますか?

ありがとう

4

1 に答える 1

1

URLではなくxmlでフォーマットされvaluesたリクエストの本文にを渡します。POSTこれをテストする簡単な方法は、Fiddlerを使用することです。

に関しては、とRegisterStreamの両方が応答本文で情報を返すことができます。サーバーが実行するアクションに応じて、適切なHTTPステータスコードを 使用して返すことができます。リソースが作成されている場合、リソースがすでに存在する場合はアプリケーションで意味のある別のステータスコードです。 POSTPUTPOST201 Created

呼び出し元は、返されたHTTPステータスコードに基づいてリソースが作成されたか、すでに存在していたかを判断できるため、bool戻り値は必要ありません。

補足:の[WebGet(...)]代わりに使用できます[WebInvoke(Method = "GET"...)]

于 2011-11-05T00:49:35.113 に答える