Как явно указать привязки метода в OpenRasta? - PullRequest
2 голосов
/ 05 ноября 2010

У меня много трудностей с маршрутизацией URL OpenRasta, особенно когда дело касается запросов PUT.

Допустим, у меня есть гипотетический обработчик UserContact, и мне нужно предоставить его со следующей подписью:

//Create a new contact:
POST /users/{userId}/contacts/create

//Update a contact:
PUT /users/{userId}/contact/{contactId}     

В обоих случаях тело запроса содержит закодированные в форме параметры для контакта.

В моем Configuration.cs у меня есть:

ResourceSpace.Uses.PipelineContributor<HttpMethodOverriderContributor>();

ResourceSpace.Has.ResourcesOfType<ContactPost>()
    .AtUri("/users/{userId}/contacts/create")
    .And.AtUri("/users/{userId}/contacts/{contactId}")
    .HandledBy<UserContactHandler>()
    .AsXmlDataContract()
    .And.AsJsonDataContract();

Мой обработчик имеет два метода:

public OperationResult Post(int userId, ContactPost contact)
public OperationResult Put(int userId, int contactId, ContactPost contact)

У меня две проблемы с этим кодом:

  1. Многие клиенты (а также наш сервер IIS) не поддерживают PUT / DELETE.В конечном счете, я бы хотел упростить это, сделав обе вышеуказанные операции POST.К сожалению, как только я это сделаю, OpenRasta не сможет определить, к какому методу я пытаюсь привязаться, и ни один из них не работает - я получу 406 Not Acceptable для запроса / create и / {contactId}.

  2. Если, однако, я сохраняю код, как указано выше, и клиент отправляет через заголовок X-HTTP-Method-Override: PUT, то запрос / create работает, но запрос / {contactId} по-прежнему возвращаетсяa 406.

Он даже не входит в мой обработчик, поэтому я не уверен, с чего начать отладку чего-то подобного.

Есть ли способсказать OpenRasta явное сопоставление маршрутов URL с определенными методами, как в ASP.NET MVC?Или есть что-то еще очевидное, что я здесь не так делаю?

1 Ответ

5 голосов
/ 05 ноября 2010

Вы можете использовать UriName в HttpOperation и метод расширения .Named (), чтобы помочь OpenRasta направить правильный метод.

Что касается вашей второй проблемы, вы должны посмотреть на выходные данные отладки, чтобы увидеть, что происходит.

В общем, OpenWrap пытается остановить вас от маршрутизации к методам и изо всех сил старается заставить вас разделять ресурсы на разные ресурсы.

В вашем примере ресурс, на который вы отправляете сообщение для создания контакта, отличается от ресурса вашего контактного пользователя, и поэтому, вероятно, должен иметь две разные регистрации.

...