Skip to main content
 首页 » 编程设计

c#之如何在 Web Api 中发布自定义命名方法

2024年01月28日26JustinYoung

我是 Web Api 的新手。我正在创建一个带有自定义命名操作的 Web Api Controller 。我正在使用 HttpClient 从 WPF 客户端调用它。但我得到一个错误 响应状态码不表示成功404(Not Found)

这是我的 Web Api Controller :

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); 
    } 
} 

我的路线是:

 //   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 } 
 ); 

我的客户代码是:

 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); 
    } 

When I send Request to server using HttpClient then i get response status code does not indicate success 404 (Not Found)

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

response status code does not indicate success 500 (Internal Server Error) form HttpClient

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

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

请您参考如下方法:

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

路由配置:

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

在你的 Controller 中:

public class ActivationController : ApiController 
{ 
    // .. other code .. 
 
    // api/Activation/NewLicense 
    [HttpPost] 
    public HttpResponseMessage NewLicense(LicenseMetadata licenseMetadata) 
    { 
        // .. rest of your code .. 
    } 
} 

我个人不喜欢默认实现,除非您尝试创建 REST API。它的工作方式是你可以有 GetFooBar 和 PostBarBaz,在 Get 和 Post< 之后你有什么并不重要。出于我的目的,我总是覆盖上面的路线。