2012-07-17 27 views
3

我使用OpenRasta框架在.NET服务,我在处理程序OpenRasta URI映射到错误的方法,并返回不一致的HTTP状态代码

public OperationResult Get(int Number) 
{ 
// Do some operation and get an entity 
    return new OperationResult.OK(Single-MyResource); 
} 

public OperationResult GetQ() 
{ 
// Do some operation and get an entity 
    return new OperationResult.OK(List-Of-MyResource); 
} 

我的配置看起来像下面

下面有两个方法:
ResourceSpace.Has.ResourcesOfType<MyResource>() 
      .AtUri("/MyResource/{Id}") 
      .And.AtUri("/MyResource") 
      .HandledBy<MyResourceHandler>() 
      .AsJsonDataContract() 
      .And.AsXmlDataContract() 


ResourceSpace.Has.ResourcesOfType<IList<MyResource>>() 
     .AtUri("/MyResources") 
     .HandledBy<MyResourceHandler>() 
     .AsJsonDataContract() 
     .And.AsXmlDataContract(); 

列举HTTPMethod:GET AcceptHeader: “应用程序/ JSON” URI:http://testDomain.com/MyResource/

的AB奥雅纳请求给我MyResource的清单,一样是我得到下面的请求

列举HTTPMethod:GET AcceptHeader: “应用/ JSON” URI:http://testDomain.com/MyResources/

改变配置后

ResourceSpace.Has.ResourcesOfType<MyResource>() 
      .AtUri("/MyResource/{Id}") 
      .And.AtUri("/MyResource").Named("MyResource") 
      .HandledBy<MyResourceHandler>() 
      .AsJsonDataContract() 
      .And.AsXmlDataContract() 

,使即

[HttpOperation(HttpMethod.GET, ForUriName = "MyResource")] 

OpenRasta回报处理程序适当的更改415 http状态码。

以上不一致。

对于我的其它资源上同等配置如上 OpenRasta抛出403的HTTP状态代码

回答

1

第一种情况是正确的。你们在两者之间共享一个处理程序。因此,当处理程序被看作选择一种方法时,有一个候选人有一个参数,另一个没有参数。当你到/ MyResource时,它找到处理程序并找到没有参数的方法。这是预期的行为。

在你的第二个配置中,那里缺少一些东西。 415是请求数据不被OR理解时。因为它是一个GET,所以不应该请求媒体类型来处理。这将需要一个调试日志来检查发生了什么。你确定你的请求没有附带一些请求数据和Content-Type吗?

+0

是的,我的请求没有传递任何数据和Content-Type。 – sham 2012-07-27 07:07:35

+0

在提琴手上执行时请求的详细信息。 GET http:// testDomain。com/RestLayer/MyResource请求标头 User-Agent:Fiddler 主机:testDomain.com 授权:令牌abcabaabcacbacba 返回的状态是415 – sham 2012-07-27 07:33:02

0

OpenRasta的GET方面,我已经在我的脑海里得到了很好的作用,这是POST我仍然挣扎:

我已经做得非常类似的事情向你JSON只,但做这样的:

ResourceSpace.Has.ResourcesOfType<IList<MyResource>>() 
       .AtUri("/myresource").And 
       .AtUri("/myresource/{id}").HandledBy<ResourceHandler>().AsJsonDataContract(); 



    [HttpOperation(HttpMethod.GET)] 
    public IEnumerable<MyResource> Get(int id = 0) 
    { 
     if (id == 0) 
      return Context.Set<MyResource>().ToList(); 
     else 
      return GetMyResourceMethod(id).ToList(); 
    } 

    private IQueryable<MyResource> GetMyResourceMethod(int id) 
    { 
     var myresource = from resource in Context.Set<MyResource>() 
         where resource.MyResourceId == id 
         select resource; 
     return myresource; 
    } 

您可以在Get方法中使用默认参数处理带参数和不带参数的参数。我认为从你的第二个配置你的ResourceType中缺少IList是因为非参数选项将返回一个列表。然后通过ToList()方法返回一个IEnumerable是不容易的。

这一切都假定您在'List-Of-MyResource'中使用SQL-to-Linq,但是我看不到代码中的那部分以及它在做什么。如果不只是忽略我已包含的私有函数并采取自己的方法。

相关问题