Я использую OpenRasta 2.0.3.0.Перегрузка методов почтового обработчика для ресурса коллекции
У меня есть ресурс коллекции ListOfActivity
и два различных вида деятельности, FileUploadActivity
и CommentActivity
. Оба класса активности наследуют от ActivityBase
.
Если я выдаю запрос GET на номер билетов {ticketId] \ действия, то я возвращаюсь ListOfActivity
. Я хотел бы иметь возможность POST любой вид деятельности для того же URI, чтобы добавлять элементы в коллекцию, но мне не удается заставить OpenRasta разрешить соответствующий метод для обработчика.
My (сокращенно) реализация обработчик:
public class ActivityHandler : ServiceBase, IActivityHandler
{
public ListOfActivityResource GetByTicketId(int ticketId)
{
...
}
public OperationResult Post(FileUploadActivity fileUploadActivity, int ticketId)
{
...
}
public OperationResult Post(CommentActivity commentActivity, int ticketId)
{
...
}
}
Вот ресурсные классы:
[XmlType(TypeName = "commentActivity")]
public class CommentActivity : ActivityBase
{
[XmlElement("comment")]
public string Comment { get; set; }
}
[XmlType(TypeName = "fileUploadActivity")]
public class FileUploadActivity : ActivityBase
{
[XmlElement("content")]
public string Content { get; set; }
}
public class ActivityBase
{
[XmlAttribute("id")]
public int Id { get; set; }
[XmlElement("when")]
public DateTime When { get; set; }
[XmlElement("who")]
public string Who { get; set; }
// this property name is purposefully not called 'TicketId' as it caused an
// issue with OpenRasta's magic URI <> method matching algorithm because the
// UriTemplate for activity resources contains a parameter of the same name
[XmlElement("ticketId")]
public int TicketIdValue { get; set; }
}
[XmlType(TypeName = "activities")]
[UriTemplate("tickets/{ticketId}/activities")]
public class ListOfActivity
{
public ListOfActivity()
{
this.Activities = new List<ActivityBase>();
}
[XmlElement("fileUpload", typeof(FileUploadActivity))]
[XmlElement("comment", typeof(CommentActivity))]
public List<ActivityBase> Activities { get; set; }
}
Отрывок из моей конфигурации является:
ResourceSpace.Has
.ResourcesOfType<ListOfActivity>()
.AtUri("tickets/{ticketId}/activities")
.HandledBy<ActivityHandler>()
.AsXmlSerializer();
ResourceSpace.Has
.ResourcesOfType<FileUploadActivity>()
.AtUri("tickets/{ticketId}/activities")
.HandledBy<ActivityHandler>()
.AsXmlSerializer();
ResourceSpace.Has
.ResourcesOfType<CommentActivity>()
.AtUri("tickets/{ticketId}/activities")
.HandledBy<ActivityHandler>()
.AsXmlSerializer();
При попытке POST a CommentActivity
, я получаю ответ 405. Вот то, что я вижу в журнале:
Found 2 operation(s) with a matching name.
Found 0 operation(s) with matching [HttpOperation] attribute.
Operation ActivityHandler::Post(FileUploadActivity fileUploadActivity, Int32 ticketId) selected with 2 required members and 0 optional members, with codec XmlSerializerCodec with score 1.
Operation ActivityHandler::Post(FileUploadActivity fileUploadActivity, Int32 ticketId) selected with 2 required members and 0 optional members, with codec XmlSerializerCodec with score 1.
Operation ActivityHandler::Post(FileUploadActivity fileUploadActivity, Int32 ticketId) selected with 2 required members and 0 optional members, with codec XmlSerializerCodec with score 1.
Operation ActivityHandler::Post(CommentActivity commentActivity, Int32 ticketId) selected with 2 required members and 0 optional members, with codec XmlSerializerCodec with score 1.
Operation ActivityHandler::Post(CommentActivity commentActivity, Int32 ticketId) selected with 2 required members and 0 optional members, with codec XmlSerializerCodec with score 1.
Operation ActivityHandler::Post(CommentActivity commentActivity, Int32 ticketId) selected with 2 required members and 0 optional members, with codec XmlSerializerCodec with score 1.
Executing OperationResult OperationResult: type=MethodNotAllowed, statusCode=405.
No response codec was searched for. The response entity is null or a response codec is already set.
There was no response entity, not rendering.
Writing http headers.
Я попытался именования URI, и с помощью HttpOperationAttribute
, но он не работает (как я вроде подозревал, так как они все же URI).
Перед введением второго ресурса активности единственный метод почты был решен в порядке.
Я делаю что-то неправильно здесь? Ответ Себастьяна Ламбла на this question, похоже, указывает, что это должно быть возможно.
Я подозревал, что что-то не так с моим подходом. Спасибо, что нашли время, чтобы собрать ответ. Подход, к которому я пришел, заключался в том, чтобы иметь отдельные URI, как вы предложили, но сохранить исходный URI коллекции, чтобы вернуть их в виде единой коллекции. –