私はOpenRasta 2.0.3.0を使用しています。コレクションリソースのポストハンドラメソッドをオーバーロード
私は、ListOfActivity
と呼ばれるコレクションリソースと、2つの異なるタイプのアクティビティ、FileUploadActivity
とCommentActivity
を持っています。両方のアクティビティクラスはActivityBase
から継承されます。
チケット{ticketId}¥activitiesにGETリクエストを発行すると、ListOfActivity
に戻ります。私はコレクションにアイテムを追加するために同じURIにどちらかの種類のアクティビティをPOSTできるようにしたいと思いますが、OpenRastaがハンドラの適切なメソッドを解決するのに問題があります。
マイ(省略)ハンドラの実装は次のとおりです。ここで
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 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だとして、私は一種の疑いがあるとして)、それは動作しません。
2つ目のアクティビティリソースが導入される前は、1つのpostメソッドが正常に解決されました。
ここで何か問題がありますか? this questionへのSebastien Lamblaの答えは、可能でなければならないことを示しているようです。
私のアプローチで何かが間違っていると思われました。答えをまとめる時間をとってくれてありがとう。私が結んできたアプローチは、あなたが示唆したように別々のURIを持つことでしたが、単一のコレクションとして戻すために元のコレクションURIを保持していました。 –