2

ジェネリック型を介してWebAPIサーバーにデータを送信する単純なクライアントがあります

次の構造は、サーバーとクライアントの両方に存在します

public interface IRequest<T>
{
    string ApiKey { get; set; }
    T RequestObject { get; set; }
}

public class UserRequest : IRequest<UserDetail>
{
    public string ApiKey { get; set; }
    public UserDetail RequestObject { get; set; }
}

次の構文を使用してサーバーにリクエストを送信します

var client = new RestClient(WebConfigurationManager.AppSettings["apiUri"]);
var profileRequest = new UserRequest
            {
                ApiKey = "xxxxx",
                RequestObject = new UserDetail {Password = txtPassword.Text, UserName = txtUserName.Text}
            };
 var request = new RestRequest("UserRequest/PostUserDetail", Method.POST);
 request.AddObject(profileRequest);

ここで興味深いのは、サーバー側では、UserDetailオブジェクトが適切に逆シリアル化されず、NULLが含まれているだけで、ApiKeyプロパティが正しく設定されていることです。

 public UserDetail PostUserDetail(UserRequest userRequest)
    {
        return new UserDetail { Password = userRequest.RequestObject.Password, UserName = userRequest.RequestObject.UserName };
    }

上記から、userRequest.ApiKeyが設定されますが、サーバーAPIではuserRequest.RequestObjectは常にNULLです。

ジェネリック型はサポートされていませんか?そうでない場合、サーバー側でデシリアライザーを変更する方法について誰かがポインターを持っていますか?オブジェクトがクライアント側で適切に構築されているかどうかを確認しました。

どうもありがとう

4

2 に答える 2

2

このWebApiシナリオがサポートされています。PostUserDetailを使用してUserRequestApiControllerを作成することにより、WebAPIを再現しようとしましたが、応答で期待される「パスワード」と「ユーザー名」を取得できました。

Request Content:
{"ApiKey":"123","RequestObject":{"Password":"bar","UserName":"foo"}}

Response Content:
{"Password":"bar","UserName":"foo"}

クライアント側では、代わりにHttpClientを使用することをお勧めします。これが私のクライアントの再現です:

        var httpClient = new HttpClient();
        var content = new ObjectContent<UserRequest>(profileRequest, new JsonMediaTypeFormatter());
        var response2 = httpClient.PostAsync(addr, content).Result; // using .Result here for simplicity...
        Console.WriteLine(response2.Content.ReadAsStringAsync().Result);
于 2012-11-26T19:09:25.893 に答える
0

Content-Typeヘッダーをサービスに送信していますか?上記のコードから、Content-Typeヘッダーを提供していないことがわかります。Content-Typeヘッダーがない場合、Web Apiはタイプのデフォルト値を生成します(UserRequestの場合はNULLになります)。

于 2012-11-26T21:30:23.020 に答える