2012-06-15 64 views
1

之前,我有这个代码返回一个任意的json对象只有一个id属性。 如何将其转换为WebApi的新RC版本,现在不支持HttpResponseMessage并且它现在使用Newtonsofts JSON.NET?如何从Asp.net WebApi RC中返回任意的json对象?

public HttpResponseMessage<JsonValue> Post(MyModel model) 
{ 
      var id = _theService.AddEntity(model); 
      dynamic okResponse = new JsonObject(); 
      okResponse["id"] = id; 
      return new CreateResponse<JsonValue>(okResponse); 
} 

而且......

public class CreateResponse<T> : ResponseBase<T> 
    { 
     public CreateResponse() 
      : base(HttpStatusCode.Created) 
     { 
     } 

     public CreateResponse(T resource) 
      : base(resource, HttpStatusCode.Created) 
     { 
     } 
    } 

public abstract class ResponseBase<T> : HttpResponseMessage<T> 
    { 
     protected ResponseBase(HttpStatusCode httpStatusCode) 
      : base(httpStatusCode) 
     { 
     } 

     protected ResponseBase(T resource, HttpStatusCode httpStatusCode) 
      : base(resource, httpStatusCode) 
     { 


      if (resource is IApiResource) 
      { 
       var apiResource = resource as IApiResource; 
       var resourceLocation = new ResourceLocation(); 
       apiResource.SetLocation(resourceLocation); 
       Headers.Location = resourceLocation.Location; 
      } 
     } 
    } 
+0

我不熟悉的RC版的WebAPI的,但是您能不能告诉你试用这个新版本,为什么它不工作? – Tisho

+0

HttpResponseMessage 不再支持,而是创建类型T的响应并将内容传递到构造函数中,而不是使用请求的扩展方法创建响应。此外,使用NetwonSoft的JSON.Net而不是System.Json类型。 – jaffa

回答

2

CreateResponse扩展方法不接受动态变量。

请更改

dynamic okResponse = new JsonObject(); 

喜欢的东西

var okResponse = new JsonObject(); 

请参阅此链接也: https://aspnetwebstack.codeplex.com/discussions/359242

+0

嗨,试过这个:var okResponse = new JsonObject(); okResponse [“id”] = 101;返回Request.CreateResponse(HttpStatusCode.Created,okResponse);但有效载荷显示{“id”:[]}? – jaffa

+0

我使用的是System.Json而不是Newtonsoft的版本。谢谢你的回答。 – jaffa

+0

嗨jaffa,我也得到有效载荷:{“Id”:[],“class”:[],“address”:{“street”:[],“zip”:[]}}。你如何解决?您能否使用Newtonsoft的版本向我展示代码语法? –

2

使用Request.CreateResponse(statuscode, content)控制器内

+0

好的,谢谢,但'内容'的类型是什么?这给了我一个编译错误:动态okResponse =新的JsonObject(); okResponse [“id”] = checkResult.NewLeadId; return Request.CreateResponse(HttpStatusCode.Created,okResponse); – jaffa

+0

另外你如何在ActionFilterAttribute :: OnActionExecuting()中实现这一点? Context.Request中没有CreateResponse扩展。 (这是一场噩梦) – jaffa

+0

Request.CreateResponse不是Web API RC的一部分。你需要codeplex源或NuGet每晚构建。 –

0

也许我失去了你的问题的东西,但你可能只是这样做:

public dynamic Post(MyModel model) 
{ 
      var id = _theService.AddEntity(model); 


      return new { id = id }; 
} 

编辑:假设你的客户端将内容类型设置为应用程序/ json