2012-06-26 104 views
1

我的WebAPI控制器的Web API调用一个复杂的对象作为参数

[HttpPost] 
public ISearchProviderCommandResult ExecuteCommand(ISearchProviderCommand command) 
{ 
    MySearchProvider searchProvider = new MySearchProvider(); 
    return searchProvider.ExecuteCommand(command); 
} 

我searchCommand对象

[Serializable] 
class SearchProviderCommand : ISearchProviderCommand 
{ 
    public string OperationContext {get; set;} 
    public string OperationId{get; set;} 
} 

我就行了 HttpWebResponse响应我的WebAPI控制器一个破发点和断点=(HttpWebResponse)request.GetResponse();

当我尝试进入webapi控制器时,出现500错误,它甚至没有击中webapi控制器内的断点。这里是我的问题:

  1. 我在做什么错?
  2. 我可以发送复杂的对象到web api请求吗?

编辑: 基础上asp.net论坛和LEONS方向我改变了我的WebAPI控制器使用对象而不是接口,它的工作原理:

[HttpPost] 
public SearchProviderCommandResult ExecuteCommand(SearchProviderCommand command) 
{ 
    MySearchProvider searchProvider = new MySearchProvider(); 
    return searchProvider.ExecuteCommand(command); 
} 

你能告诉我怎样重建我的结果是什么?

编辑:根据莱昂的建议 - 为那些有兴趣谁在这里是我最后的调用者的代码

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; } 
} 
+0

您可以将自定义对象作为参数传递给动作。根据您使用的属性前缀的http方法,您可以使用[FromBody]进行发布。 – gdp

+0

我曾试过,甚至在我发布这个问题之前,可悲的是,没有做到这一点,我应该更新我的问题与属性? –

回答

1

您使用了BinaryFormatter的?您不应该将您的请求编码为JSON,因为这是您发送的内容?

+0

我在网上找到了这个例子,你有我的例子吗? –

+0

我改变了我的代码以这种方式序列化:'code'var jsonSerializer = new System.Web.Script.Serialization.JavaScriptSerializer(); string json = jsonSerializer.Serialize(searchCommand); byte [] bytes = Encoding.UTF8.GetBytes(json); requestStream.Write(bytes,0,bytes.Length);'code' –

+0

在再次查看您的电子邮件时,我错过了可能很明显的一点 - 您正在使用一个界面。我不确定你可以这样做,因为WebAPI将尝试在参数中创建对象,而在接口上它不能这样做,也许你可以使用ModelBinders(http://blogs.msdn.com/ b/jmstall/archive/2012/04/20/how-to-bind-to-custom-objects-in-action-signatures-in-mvc-webapi.aspx) – leon

相关问题