OpenRasta URI сопоставляется с неправильным методом и возвращает несовместимые коды состояния http

Я использую каркас OpenRasta в сервисе.net, и у меня есть два метода, как показано ниже в обработчике

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: URI "application / json": http://testdomain.com/MyResource/

Приведенный выше запрос дает мне список MyResource, такой же, какой я получаю для следующего запроса.

HttpMethod: GET AcceptHeader: URI "application / json": 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 Status Code

2 ответа

Первый случай правильный. Вы делите обработчик между ними. Таким образом, когда рассматривается обработчик для выбора метода, существует один кандидат с параметром и один без него. Когда вы переходите к /MyResource, он находит обработчик и находит метод, у которого нет параметра. Это ожидаемое поведение.

Во второй конфигурации там что-то не хватает. 415 - это когда данные запроса не поняты OR. Так как это GET, не должно быть типа носителя запроса для обработки. Для этого потребуется журнал отладки, чтобы проверить, что происходит. Вы уверены, что ваш запрос не приходит с некоторыми данными запроса и Content-Type?

GET сторона OpenRasta, у меня довольно хорошо, это ПОЧТА, с которой я все еще борюсь:

Я сделал с тобой действительно похожие вещи только для 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. Я думаю, из вашей второй конфигурации вы пропустили IList из вашего ResourceType, потому что непараметрическая опция вернет список. Затем нецелесообразно возвращать IEnumerable через метод ToList().

Все это предполагает, что вы используете SQL-to-Linq в вашем List-Of-MyResource, но я не вижу этой части вашего кода и того, что он делает. Если не просто игнорировать частную функцию, которую я включил, и использовать свой собственный подход.

Другие вопросы по тегам