WebApi OData 删除路由约定
WebApi OData Delete routing convention
我有一个 MVVM 项目。
对于模型,我首先使用 EF6.0.0 代码和 WebApi。
总的来说一切正常,但有一点。
当我删除后 URL 组成
http://localhost:50346/Recruiters/Addresses(guid'5d778c9d-56b2-449b-b655-22489e01636d')/CIP.Models.Domain.Addresses
这会导致 404 错误。
所以我创建了这样的路由约定:
using Microsoft.Data.Edm;
using System;
using System.Collections.Generic;
using System.Diagnostics.Contracts;
using System.Linq;
using System.Net.Http;
using System.Web;
using System.Web.Http.Controllers;
using System.Web.Http.OData.Routing;
using System.Web.Http.OData.Routing.Conventions;
namespace CIP
{
public class AddressesRoutingConvention : EntitySetRoutingConvention
{
public override string SelectAction(ODataPath odataPath, HttpControllerContext controllerContext, ILookup<string, HttpActionDescriptor> actionMap)
{
if (odataPath.PathTemplate == "~/entityset/key/cast")
{
HttpMethod httpMethod = controllerContext.Request.Method;
string httpMethodName;
switch (httpMethod.ToString().ToUpperInvariant())
{
case "DELETE":
httpMethodName = "Delete";
break;
default:
return null;
}
Contract.Assert(httpMethodName != null);
IEdmEntityType entityType = odataPath.EdmType as IEdmEntityType;
string actionName = httpMethodName + entityType.Name;
if (actionName != null)
{
KeyValuePathSegment keyValueSegment = odataPath.Segments[1] as KeyValuePathSegment;
controllerContext.RouteData.Values[ODataRouteConstants.Key] = keyValueSegment.Value;
return actionName;
}
}
// Not a match
return null;
}
}
}
并添加了这条路线
var conventions = ODataRoutingConventions.CreateDefault();
conventions.Insert(0, new AddressesRoutingConvention());
config.Routes.MapODataRoute("Addresses", "Addresses", addressesBuilder.GetEdmModel(), new DefaultODataPathHandler(), conventions);`
并在控制器中
public async Task<IHttpActionResult> DeleteAddresses([FromODataUri] Guid key)
{
Addresses addresses = await db.Addresses.FindAsync(key);
if (addresses == null)
{
return NotFound();
}
db.Addresses.Remove(addresses);
await db.SaveChangesAsync();
return StatusCode(HttpStatusCode.NoContent);
}
但我仍然收到 404 错误。
我尝试从 SOAPUI 对其进行测试,结果相同。
我是不是漏掉了什么?
亲切的问候
杰伦
杰伦
我认为你所做的可以奏效。
但是,根据您的 OData 路由设置,您的以下请求 Uri 不正确:
http://localhost:50346/Recruiters/Addresses(guid'5d778c9d-56b2-449b-b655-22489e01636d')/CIP.Models.Domain.Addresses
因为你的OData路由设置是:
config.Routes.MapODataRoute("Addresses", "Addresses", addressesBuilder.GetEdmModel(), ...
那么,你的请求Uri应该是:
http://localhost:50346/Addresses/Addresses(guid'5d778c9d-56b2-449b-b655-22489e01636d')/CIP.Models.Domain.Addresses
为什么要写"Recruiters"?
这是我使用所有示例代码的调试信息:
此外,为什么要对一个强制转换的 Uri 发出 **Delete** 请求?好像最后一个type case段(也就是:CIP.Models.Domain.Addresses)不是必须的?
您可以参考OData Spec. If you find any issue for Web API OData, you can directly file an issue on WebApi OData On Github中的删除实体部分。
谢谢。
谢谢。
除了一些小错误,代码还可以。
原来是我的web.config出了问题。
添加以下配置后,一切正常,甚至断点:
<system.webServer>
<handlers>
<clear/>
<add name="ExtensionlessUrlHandler-Integrated-4.0" path="/*"
verb="*" type="System.Web.Handlers.TransferRequestHandler"
preCondition="integratedMode,runtimeVersionv4.0" />
</handlers>
</system.webServer>
杰伦
我有一个 MVVM 项目。 对于模型,我首先使用 EF6.0.0 代码和 WebApi。
总的来说一切正常,但有一点。
当我删除后 URL 组成
http://localhost:50346/Recruiters/Addresses(guid'5d778c9d-56b2-449b-b655-22489e01636d')/CIP.Models.Domain.Addresses
这会导致 404 错误。
所以我创建了这样的路由约定:
using Microsoft.Data.Edm;
using System;
using System.Collections.Generic;
using System.Diagnostics.Contracts;
using System.Linq;
using System.Net.Http;
using System.Web;
using System.Web.Http.Controllers;
using System.Web.Http.OData.Routing;
using System.Web.Http.OData.Routing.Conventions;
namespace CIP
{
public class AddressesRoutingConvention : EntitySetRoutingConvention
{
public override string SelectAction(ODataPath odataPath, HttpControllerContext controllerContext, ILookup<string, HttpActionDescriptor> actionMap)
{
if (odataPath.PathTemplate == "~/entityset/key/cast")
{
HttpMethod httpMethod = controllerContext.Request.Method;
string httpMethodName;
switch (httpMethod.ToString().ToUpperInvariant())
{
case "DELETE":
httpMethodName = "Delete";
break;
default:
return null;
}
Contract.Assert(httpMethodName != null);
IEdmEntityType entityType = odataPath.EdmType as IEdmEntityType;
string actionName = httpMethodName + entityType.Name;
if (actionName != null)
{
KeyValuePathSegment keyValueSegment = odataPath.Segments[1] as KeyValuePathSegment;
controllerContext.RouteData.Values[ODataRouteConstants.Key] = keyValueSegment.Value;
return actionName;
}
}
// Not a match
return null;
}
}
}
并添加了这条路线
var conventions = ODataRoutingConventions.CreateDefault();
conventions.Insert(0, new AddressesRoutingConvention());
config.Routes.MapODataRoute("Addresses", "Addresses", addressesBuilder.GetEdmModel(), new DefaultODataPathHandler(), conventions);`
并在控制器中
public async Task<IHttpActionResult> DeleteAddresses([FromODataUri] Guid key)
{
Addresses addresses = await db.Addresses.FindAsync(key);
if (addresses == null)
{
return NotFound();
}
db.Addresses.Remove(addresses);
await db.SaveChangesAsync();
return StatusCode(HttpStatusCode.NoContent);
}
但我仍然收到 404 错误。
我尝试从 SOAPUI 对其进行测试,结果相同。
我是不是漏掉了什么?
亲切的问候
杰伦
杰伦
我认为你所做的可以奏效。
但是,根据您的 OData 路由设置,您的以下请求 Uri 不正确:
http://localhost:50346/Recruiters/Addresses(guid'5d778c9d-56b2-449b-b655-22489e01636d')/CIP.Models.Domain.Addresses
因为你的OData路由设置是:
config.Routes.MapODataRoute("Addresses", "Addresses", addressesBuilder.GetEdmModel(), ...
那么,你的请求Uri应该是:
http://localhost:50346/Addresses/Addresses(guid'5d778c9d-56b2-449b-b655-22489e01636d')/CIP.Models.Domain.Addresses
为什么要写"Recruiters"?
这是我使用所有示例代码的调试信息:
此外,为什么要对一个强制转换的 Uri 发出 **Delete** 请求?好像最后一个type case段(也就是:CIP.Models.Domain.Addresses)不是必须的?
您可以参考OData Spec. If you find any issue for Web API OData, you can directly file an issue on WebApi OData On Github中的删除实体部分。 谢谢。
谢谢。
除了一些小错误,代码还可以。
原来是我的web.config出了问题。 添加以下配置后,一切正常,甚至断点:
<system.webServer>
<handlers>
<clear/>
<add name="ExtensionlessUrlHandler-Integrated-4.0" path="/*"
verb="*" type="System.Web.Handlers.TransferRequestHandler"
preCondition="integratedMode,runtimeVersionv4.0" />
</handlers>
</system.webServer>
杰伦