WebApi ActionName删除路由不起作用

弗洛

我的项目包含几个WebApi控制器,每个控制器通常提供三个操作:get(guid),post(data)和delete(guid)。
s中描述了WebApiconfig此需求的默认路由(名称:ControllerAndId

现在,我必须实现一个必须处理不同后操作的控制器。为此,我尝试用映射另一条路线ActionNames(名称:ControllerAndActionAndId

由于我已经映射了ControllerAndActionAndId路由,因此无法调用“普通”控制器的删除路由(例如:)Contactscontroller
除删除路由外,所有路由都有效。

StatusCode:404,ReasonPhrase:“未找到”

有一个通常的ApiController的示例:

    public class ContactsController : ApiController
{
    public IEnumerable<Contact> Get()
    {
        return GetContacts();
    }

    public HttpResponseMessage Post(Contact contact)
    {            
        SaveContact(contact);

        return Request.CreateResponse<Guid>(_code, contact.Id);
    }

    public void Delete(Guid id)
    {
        DeleteContact(id);
    }
}

具有ActionName-Route的控制器:

    public class AttachmentsController : ApiController
{
    [HttpGet]
    public Attachment Get(Guid attachmentId)
    {
        return GetAttachment(attachmentId);
    }

    [HttpPost]
    [ActionName("save")]
    public HttpResponseMessage Save(AttachmentSaveData saveData)
    {
        SaveAttachment(saveData);
    }

    [HttpPost]
    [ActionName("remove")]
    public HttpResponseMessage Remove(AttachmentDeleteData deleteData)
    {
       DeleteAttachment(deleteData);            
    }
}

WebApiConfig:

            // Web API routes
        config.MapHttpAttributeRoutes();

        // Controller with ID
        // To handle routes like `/api/VTRouting/route/1`
        config.Routes.MapHttpRoute(
            name: "ControllerAndActionAndId",
            routeTemplate: "api/{controller}/{action}/{id}",
            defaults: new
            {
                id = RouteParameter.Optional,
                action = RouteParameter.Optional
            }
        );

        // Controller with ID
        // To handle routes like `/api/VTRouting/1`
        config.Routes.MapHttpRoute(
            name: "ControllerAndId",
            routeTemplate: "api/{controller}/{id}",
            defaults: new
            {
                id = RouteParameter.Optional
            }
        );

ClientAction删除功能:

        private void Delete(string uri, int id)
    {
        using (HttpClient _client = new HttpClient())
        {
            _client.BaseAddress = BaseAddress;
            string _url = string.Format("{0}/{1}", uri, id);
            var _response = _client.DeleteAsync(_url).Result;

            if (!_response.IsSuccessStatusCode)
            {
                throw new Exception();
            }
        }
    }

我目前没有进一步的想法如何解决此问题。

拉米尔·阿里耶夫(Ramil Aliyev)

如果使用Web API,则需要添加HTTP动词来执行操作。

例如,您的代码必须如下所示:

public class ContactsController : ApiController
{ 
    [HttpGet]
    public IEnumerable<Contact> Get()
    {
        return GetContacts();
    }

    [HttpPost]
    public HttpResponseMessage Post(Contact contact)
    {            
        SaveContact(contact);

        return Request.CreateResponse<Guid>(_code, contact.Id);
    }

    [HttpDelete]
    public void Delete(Guid id)
    {
        DeleteContact(id);
    }
}

注意删除动作

  1. 如果在操作中使用HttpDelete动词,则必须从client发送删除请求httpClient.DeleteAsync(...)
  2. 如果在操作中使用HttpPost动词,则必须从client发送发帖请求httpClient.PostAsync(...)

AttachmentsController与ContactsController类似。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章