2

我有一个简单的客户端,它通过泛型类型将数据发送到 Web api 服务器

服务器和客户端都存在以下结构

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

支持此 Web Api 方案。我已经尝试通过使用 PostUserDetail 创建 UserRequest ApiController 来重现您的 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 回答