我有一个带有不同动作的webapi Controller类,GET和PUT工作正常,POST一直失败,我很沮丧。也许你可以给我一些提示我如何解决这个问题。
控制器操作:
[RoutePrefix("api/v1/jobs")]
public class JobsController : ApiController
{
[ActionName("PostInactiveStatus")]
[System.Web.Http.AcceptVerbs("POST")]
[System.Web.Http.HttpPost]
public IHttpActionResult PostInactiveStatus(Job job)
{
CsJobSchedulerEntities dataContext = new CsJobSchedulerEntities();
try
{
var refJob = (from j in dataContext.Job
where j.JOB_ID == job.JOB_ID
select j).SingleOrDefault();
refJob.JOB_ACTIVE = 0;
refJob.JOB_MUSER = job.JOB_MUSER;
refJob.JOB_MDATE = DateTime.Now;
dataContext.SaveChanges();
var jobs = dataContext.Job.ToList();
return Ok(jobs);
}
catch (Exception ex)
{
return ResponseMessage(Request.CreateErrorResponse(HttpStatusCode.InternalServerError, new HttpError(ex.Message)));
}
}
}
WebapiConfig类:
public static void Register(HttpConfiguration config)
{
config.MapHttpAttributeRoutes();
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{action}/{key}",
defaults: new { key = RouteParameter.Optional }
);
//PAM: Add Default Message Handler when Content-Type is Empty
config.MessageHandlers.Add(new DefaultContentTypeMessageHandler());
//PAM: Web API configuration and services
EnableCrossSiteRequests(config);
}
private static void EnableCrossSiteRequests(HttpConfiguration config)
{
var cors = new EnableCorsAttribute(
origins: "*",
headers: "*",
methods: "*");
config.EnableCors(cors);
}
客户要求:
function removeJob(data) {
jQuery.support.cors = true;
$.ajax({
url: HOST + "api/v1/jobs/PostInactiveStatus",
type: "Post",
data: data,
async: false,
beforeSend: function () {
},
success: function (data) {
},
error: function (xhr, ajaxOptions, thrownError) {
}
});
}
}
错误讯息:
"消息":"未找到与请求URI匹配的HTTP资源
http://localhost:59732/api/v1/jobs/PostInactiveStatus
。&#34 ;, " MessageDetail":"未找到与命名控制器匹配的类型 ' V1'"
我失败的地方?
更新:Controller已添加了RoutePrefix,用于对API进行版本控制,因为GET和PUT工作正常。
答案 0 :(得分:2)
假设控制器的名称是String sql = "SELECT poMast.ORDNO, CAST(poMast.ORDNO AS VARCHAR(255) CCSID UNICODE) FROM AMFLIBL.POMAST AS poMast ";
,并且OP中定义了路由模板
JobsController
是准确的,然后更新ajax调用以匹配预期的路由模板
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{action}/{key}",
defaults: new { key = RouteParameter.Optional }
);
其他明智的做法是必须为路线模板中包含url: HOST + "api/jobs/PostInactiveStatus",
的网址定义新路线
v1
<强>更新强>
根据添加的信息,缺少操作的路径属性。把它包括在行动中。
config.MapHttpAttributeRoutes();
config.Routes.MapHttpRoute(
name: "V1Api",
routeTemplate: "api/v1/{controller}/{action}/{key}",
defaults: new { key = RouteParameter.Optional }
);
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{action}/{key}",
defaults: new { key = RouteParameter.Optional }
);