ODataメソッドを切り替えるときに、文字列をキーとして整数ではなくキーとして使用する際に問題が発生しています。どのようなものであれ整数のように振る舞うようですね??ODataメソッドのキーを整数から文字列に変更する
古い方法(整数に気づく):
[EnableQuery]
public SingleResult<Order> Get([FromODataUri] int key)
{
IQueryable<Order> result = db.Orders.Where(o => o.OrderId == key);
return SingleResult.Create(result);
}
古いURL(素晴らしい仕事):
api/orders(250)/
新しいメソッド(文字列に注意してください):
[EnableQuery]
public SingleResult<Order> Get([FromODataUri] string key)
{
IQueryable<Order> result = db.Orders.Where(o => o.MyCustomId == key);
return SingleResult.Create(result);
}
新しいURL はとなります。
api/orders('13-Abc.56.77.Blah.Blah')/
マイウェブAPIルーティングは次のようになります。
public static void Register(HttpConfiguration config)
{
// Web API configuration and routes
config.MapHttpAttributeRoutes();
//OData configuration
ODataModelBuilder builder = new ODataConventionModelBuilder();
builder.EntitySet<Order>("orders");
builder.EntityType<Order>().Function("getordersummary").Returns<OrderSummary>();
var _model = builder.GetEdmModel();
var defaultConventions = ODataRoutingConventions.CreateDefaultWithAttributeRouting(config, _model);
var conventions = defaultConventions.Except(defaultConventions.OfType<MetadataRoutingConvention>());
config.MapODataServiceRoute(
routeName: "ODataRoute",
routePrefix: "api",
routingConventions: conventions,
pathHandler: new DefaultODataPathHandler(),
model: _model);
//make uri calls much easier
config.EnableUnqualifiedNameCall(true);
//ensure JSON responses
var appXmlType = config.Formatters.XmlFormatter.SupportedMediaTypes.FirstOrDefault(t => t.MediaType == "application/xml");
config.Formatters.XmlFormatter.SupportedMediaTypes.Remove(appXmlType);
}
新しいURLは動作しません:
/api/orders('13-2011.01')/
/api/orders(13-2011.01)/
/api/orders('ABC')/
/api/orders(ABC)/
しかし、新しいURLはのための作業を行います。
/api/orders(13201101)/
/api/orders(123)/
デバッグ中に新しい "Get"コントローラメソッドにブレークポイントを設定した場合、新しいURLは次のようになりますときlyがヒットを取得します:
/api/orders(13201101)/
新しいURLは次のようになります場合は、ブレークポイントがヒットしません。私のSQL Serverデータベーステーブルで
/api/orders('13-2011.01')/
/api/orders(13-2011.01)/
が、私は主を作りましたキー[MyCustomId]フィールド。次に、EntityFrameworkモデル(.edmx)を更新し、[Order]クラスの[MyCustomId]フィールドにEntityキーを割り当てました。 URLはまだ正しく動作しません。
ルーティングに問題がありますか? なぜ新しいURLは、 "[FromODataUri] string key"と明確に定義されている場合に限り、整数だけを受け入れますか?
**アップデート:私のURLに「ドット」を許可するための書き換えハンドラが既に追加されています。私はそれを言及すべきです。それは正常に動作し、この移行前に作業していました。たとえば、次のようなURLがあります。
http://www.mywebsite.com/MyApplication/OrderInfo/OrderSummary/13-2011.01/
これは単純に機能しないODataメソッドです。
ところで、あなたのURIに後続のスラッシュは必要ありません。それらは無害です(OData URIパーサーは無視しています)が、技術的には間違っています。 – lencharest