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
如果您不想使用在操作名称中使用Get/Post的默认实现,而是想要调用方法,请调整您的路径(只是第一个,没有第二个获取) ),并停止使用Get和Post前缀.
路线配置:
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.它的工作方式是,你可以有GetFooBar和PostBarBaz,这不要紧,你有什么后Get和Post.为了我的目的,我总是覆盖上面的路线.