如何在Web Api中发布自定义命名方法?

Md.*_*man 1 .net c# asp.net-mvc-4 asp.net-web-api visual-studio-2012

我是Web Api的新手.我正在创建一个带有自定义命名操作的Web Api控制器.我是使用HttpClient从WPF客户端调用它的.但我收到错误 响应状态代码并不表示成功404(未找到)

这是我的Web Api控制器:

public class ActivationController : ApiController
{
    private readonly IActivationUnit _activationUnit;

    public ActivationController()
    {
        _activationUnit = new ActivationUnit();
    }

    //  api/activation/GetAllActivisionInformations
    public HttpResponseMessage GetAllActivationInformations(string username)
    {
        return Request.CreateResponse(HttpStatusCode.OK, _activationUnit.ActivationRepository.GetActivationInformations(username));
    }

    // api/activation/NewLicense
    [HttpPost]
    public HttpResponseMessage PostNewLicense(LicenseMetadata licenseMetadata)
    {
        bool isSuccess = _activationUnit.ActivationRepository.NewLicense(licenseMetadata.Username, licenseMetadata.ActivisionInformation);
        if (isSuccess)
        {
            try
            {
                _activationUnit.Save();
            }
            catch (Exception)
            {
                isSuccess = false;
            }
        }
        return Request.CreateResponse(isSuccess ? HttpStatusCode.OK : HttpStatusCode.BadRequest, isSuccess);
    }
}
Run Code Online (Sandbox Code Playgroud)

我的路由是:

 //   Route for POST method
 config.Routes.MapHttpRoute(
 name: "DefaultApi2",
 routeTemplate: "api/{controller}/{action}/{id}",
 defaults: new { id = RouteParameter.Optional }
 );

 //   Route  GET method

 config.Routes.MapHttpRoute(
 name: "DefaultApi1",
 routeTemplate: "api/{controller}/{action}/{id}",
 defaults: new { action = "get", id = RouteParameter.Optional }
 );
Run Code Online (Sandbox Code Playgroud)

我的客户代码是:

 HttpClient client = new HttpClient();
 client.BaseAddress = new Uri("http://localhost:42471");
 client.DefaultRequestHeaders.Accept.Add(
       new MediaTypeWithQualityHeaderValue("application/json"));

 var licenseMetadata = new LicenseMetadata
      {
         ActivisionInformation = new ActivisionInformation(),
         Username = "UserName"
       };

 var response = await client.PostAsJsonAsync("api/activation/NewLicense", licenseMetadata);
 try
   {
      response.EnsureSuccessStatusCode();
      MessageBox.Show("Success");

    }
    catch (Exception ex)
    {
       MessageBox.Show(ex.Message);
    }
Run Code Online (Sandbox Code Playgroud)

当我使用HttpClient向服务器发送请求时,我得到响应状态代码并不表示成功404(未找到)

我试图将URL"api/activation/newlicense"更改为"api/activation/PostNewLicense"但在这种情况下我得到

响应状态代码不表示 HttpClient 成功500(内部服务器错误)

我在哪里做错了.我已经花了两天时间.

我正在使用:Visual Studio 2012,.NET 4,MVC 4,Windows 8,IIS 8

Tim*_*ers 6

如果您不想使用在操作名称中使用Get/Post的默认实现,而是想要调用方法,请调整您的路径(只是第一个,没有第二个获取) ),并停止使用GetPost前缀.

路线配置:

config.Routes.MapHttpRoute(
    name: "DefaultActionNameApi",
    routeTemplate: "api/{controller}/{action}/{id}",
    defaults: new { id = RouteParameter.Optional }
};
Run Code Online (Sandbox Code Playgroud)

在您的控制器中:

public class ActivationController : ApiController
{
    // .. other code ..

    // api/Activation/NewLicense
    [HttpPost]
    public HttpResponseMessage NewLicense(LicenseMetadata licenseMetadata)
    {
        // .. rest of your code ..
    }
}
Run Code Online (Sandbox Code Playgroud)

我个人不喜欢默认实现,除非您尝试创建REST API.它的工作方式是,你可以有GetFooBarPostBarBaz,这不要紧,你有什么后GetPost.为了我的目的,我总是覆盖上面的路线.