1

次のようなWebサービスがあります。

[WebInvoke(UriTemplate = "/{userName}/?key={key}&machineName={machineName}", Method = "PUT")]
public HttpResponseMessage<SomeStuffPutResponse> PutSomeStuff(string userName, string key, string machineName, string theTextToPut)
{
     // do stuff
}

私の global.asx は次のようになります。

RouteTable.Routes.MapServiceRoute<SomeStuffService>("1.0/SomeStuff", new HttpHostConfiguration());

C# HttpClient または fiddler を介して Web サービスにアクセスすると、500 がスローされ、メソッドに到達しません。一連のログを追加しましたが、次のエラーが発生しています。

サービス操作 'PutSomeStuff' は、入力パラメーター 'requestMessage' のタイプ 'String' に割り当て可能な値を期待していましたが、タイプ 'HttpRequestMessage`1' の値を受け取りました。

更新: theTextToPut 変数をカスタム オブジェクトにすると、正常に動作します。文字列のようなプリミティブ型の場合、問題が発生するだけです。

4

3 に答える 3

2

解決策 1.

theTextToPut パラメータを HttpRequestMessage に変更してから、メッセージの内容を読み取ることができます。

[WebInvoke(UriTemplate = "/{userName}/?key={key}&machineName={machineName}", Method = "PUT")]
public HttpResponseMessage<SomeStuffPutResponse> PutSomeStuff(string userName, string key, string machineName, HttpRequestMessage request)
{
     string theTextToPut = request.Content.ReadAsString();
}

解決策 2。

本当にパラメーターを文字列として取得したい場合は、「theTextToPut」という名前のすべての文字列パラメーターを処理する操作ハンドラーを作成できます。

public class TextToPutOperationHandler : HttpOperationHandler<HttpRequestMessage, string>
    {
        public TextToPutOperationHandler() 
            : this("theTextToPut")
        { }

        private TextToPutOperationHandler(string outputParameterName) 
            : base(outputParameterName)
        { }

        public override string OnHandle(HttpRequestMessage input)
        {
            return input.Content.ReadAsString();
        }
    }

次に、次のように Global.asax でサービスを設定します。

RouteTable.Routes.MapServiceRoute<SomeStuffService>("1.0/SomeStuff",
                new HttpHostConfiguration().AddRequestHandlers(x => x.Add(new TextToPutOperationHandler())));
于 2011-06-27T06:40:10.733 に答える
0

theTextToPuturiで文字列を探しています。

于 2011-06-24T01:27:22.363 に答える
0

@ axel22 が言うように、おそらくアプリケーションはtheTextToPutURI にバインドされています。この記事で述べているように、単純型はデフォルトで URI にバインドされています。

FromBody 属性を使用して、アプリケーションを強制的にtheTextToPutリクエスト本文にバインドできます。

于 2016-04-05T09:30:33.120 に答える