Asp.net mvc 4 以复杂对象作为参数的Web Api调用

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

我的webApi控制器

[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控制器内的断点。以下是我的问题:

  • 我做错了什么
  • 我可以向web api请求发送复杂对象吗
  • 编辑: 根据asp.net论坛和leons的指示,我将我的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()。您可能希望将所有这些序列化隐藏在一个实用程序/代理类中,该类调用您的服务,以便您的服务只看到接口(您可以通过泛型方法实现)。