从客户端向服务器发送通用类型

时间:2012-11-26 18:25:07

标签: asp.net-web-api

我有一个简单的客户端,通过泛型类型

将数据发送到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,但是,userRequest.RequestObject在服务器API上始终为NULL

是否不支持通用类型?如果没有,有没有人有任何关于如何修改服务器端的反序列化器的指针?我已经检查过,看看对象是否在客户端正确构建,它是。

非常感谢

2 个答案:

答案 0 :(得分: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);

答案 1 :(得分:0)

您是否将Content-Type标头发送到服务?从上面的代码中,我看到您没有提供Content-Type标头。在没有Content-Type标头的情况下,Web Api会生成该类型的默认值(对于UserRequest,它将为NULL)。