Asp.net mvc 4 以复杂对象作为参数的Web Api调用
我的webApi控制器Asp.net mvc 4 以复杂对象作为参数的Web Api调用,asp.net-mvc-4,asp.net-web-api,Asp.net Mvc 4,Asp.net Web Api,我的webApi控制器 [HttpPost] public ISearchProviderCommandResult ExecuteCommand(ISearchProviderCommand command) { MySearchProvider searchProvider = new MySearchProvider(); return searchProvider.ExecuteCommand(command); } 我的搜索命令对象 [Serializable] class
[HttpPost]
public ISearchProviderCommandResult ExecuteCommand(ISearchProviderCommand command)
{
MySearchProvider searchProvider = new MySearchProvider();
return searchProvider.ExecuteCommand(command);
}
我的搜索命令对象
[Serializable]
class SearchProviderCommand : ISearchProviderCommand
{
public string OperationContext {get; set;}
public string OperationId{get; set;}
}
我在webapi控制器中有一个断点,在线路上有一个断点
HttpWebResponse=(HttpWebResponse)request.GetResponse()
当我尝试进入webapi控制器时,我得到一个500错误,它甚至没有到达webapi控制器内的断点。以下是我的问题:
[HttpPost]
public SearchProviderCommandResult ExecuteCommand(SearchProviderCommand command)
{
MySearchProvider searchProvider = new MySearchProvider();
return searchProvider.ExecuteCommand(command);
}
你能告诉我如何根据结果重建我的物体吗
编辑:基于leon的建议-对于那些感兴趣的人,这里是我最后的来电代码
public result ExecuteCommand(ISearchProviderCommand searchCommand)
{
//serialize the object before sending it in
JavaScriptSerializer serializer = new JavaScriptSerializer();
string jsonInput = serializer.Serialize(searchCommand);
HttpClient httpClient = new HttpClient() { BaseAddress = new Uri(ServiceUrl) };
StringContent content = new StringContent(jsonInput, Encoding.UTF8, "application/json");
var output = httpClient.PostAsync(ServiceUrl, content).Result;
//deserialize the output of the webapi call
result c = serializer.Deserialize<result>(output.Content.ReadAsStringAsync().Result);
return c;
}
}
public class result : ISearchProviderCommandResult
{
public object Result { get; set; }
}
公共结果执行命令(ISearchProviderCommand searchCommand)
{
//在发送对象之前序列化该对象
JavaScriptSerializer serializer=新的JavaScriptSerializer();
字符串jsonInput=serializer.Serialize(searchCommand);
HttpClient HttpClient=newHttpClient(){BaseAddress=newURI(ServiceUrl)};
StringContent=newstringcontent(jsonInput,Encoding.UTF8,“application/json”);
var output=httpClient.PostAsync(ServiceUrl,content).Result;
//反序列化webapi调用的输出
结果c=serializer.Deserialize(output.Content.ReadAsStringAsync().result);
返回c;
}
}
公共类结果:ISearchProviderCommandResult
{
公共对象结果{get;set;}
}
您正在使用二进制格式化程序?您不应该将请求编码为JSON,因为这就是您要发送的内容吗?您正在使用BinaryFormatter?您是否应该将请求编码为JSON,因为这就是您要发送的内容?您可以将自定义对象作为参数传递给操作。根据使用属性作为前缀的http方法,对于post,您可以使用[FromBody]。我在发布问题之前就已经尝试过了,遗憾的是,我没有做到这一点,我应该使用属性更新问题吗?您可以将自定义对象作为参数传递给操作。根据http方法的不同,您可以使用属性作为前缀,对于post,您可以使用[FromBody]。我在发布问题之前就已经尝试过了,遗憾的是,我没有做到这一点,我应该使用属性更新我的问题吗?我在网上找到了这个示例,你有一个例子让我看看吗?我改变了我的代码以这种方式序列化:
code
var-jsonSerializer=new-System.Web.Script.Serialization.JavaScriptSerializer();字符串json=jsonSerializer.Serialize(searchCommand);byte[]bytes=Encoding.UTF8.GetBytes(json);requestStream.Write(字节、0、字节、长度)code
再次查看您的电子邮件时,我错过了可能很明显的一点—您正在使用一个界面。我不确定您是否能做到这一点,因为WebAPI将尝试在参数中创建对象,这在接口上是做不到的,也许您可以看看使用ModelBinders()谢谢您的回答,请参阅我对我文章的编辑。我在它的末尾添加了一个问题。Call.Deserialize(string,type)和result()。您可能希望将所有这些序列化隐藏在一个实用程序/代理类中,该类调用您的服务,以便您的服务只看到接口(您可以通过泛型方法来完成)。我在网上找到了这个示例,你有一个例子让我看看吗?我改变了我的代码以这种方式序列化:code
var-jsonSerializer=new-System.Web.Script.Serialization.JavaScriptSerializer();字符串json=jsonSerializer.Serialize(searchCommand);byte[]bytes=Encoding.UTF8.GetBytes(json);requestStream.Write(字节、0、字节、长度)code
再次查看您的电子邮件时,我错过了可能很明显的一点—您正在使用一个界面。我不确定您是否能做到这一点,因为WebAPI将尝试在参数中创建对象,这在接口上是做不到的,也许您可以看看使用ModelBinders()谢谢您的回答,请参阅我对我文章的编辑。我在它的末尾添加了一个问题。Call.Deserialize(string,type)和result()。您可能希望将所有这些序列化隐藏在一个实用程序/代理类中,该类调用您的服务,以便您的服务只看到接口(您可以通过泛型方法实现)。