我有一个简单的客户端,通过泛型类型
将数据发送到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
是否不支持通用类型?如果没有,有没有人有任何关于如何修改服务器端的反序列化器的指针?我已经检查过,看看对象是否在客户端正确构建,它是。
非常感谢
答案 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)。