【发布时间】:2015-01-29 03:15:03
【问题描述】:
- WebForms 4.5.1,WebAPI 2
- 基于 ABP 样板的项目(http://aspnetboilerplate.com/ 版本 0.4.1.0)
我有一个如下定义的 Web API 控制器:
[HttpPost]
public class EmailActivitiesController : ApiController
{
public HttpResponseMessage EmailAClientWithNewMailMessage(FormDataCollection aFormData)
{
}
}
使用以下 jQuery 调用:
var aFormData = {};
$.support.cors = true;
$.ajax({
cache: false,
url: '/api/EmailActivities/EmailAClientWithNewMailMessage',
type: "POST",
dataType: "json",
data: aFormData,
success: function (callback) {
//Platform.LoadingPanelHide();
alert("Successfully sent the email.");
},
error: function (data) {
var errorObject = JSON.parse(data);
//Platform.LoadingPanelHide();
alert('There was a problem sending the email message to the individual selected.\n\n' + errorObject.responseText.message);
}
});
一切正常,并达到 API 方法。但是,只要我按如下方式填充 aFormData:
var aFormData = {};
aFormData['aMessageInfo'] = "test";
//And sending via form data
$.support.cors = true;
$.ajax({
cache: false,
url: '/api/EmailActivities/EmailAClientWithNewMailMessage',
type: "POST",
dataType: "json",
data: aFormData,
success: function (callback) {
//Platform.LoadingPanelHide();
alert("Successfully sent the email.");
},
error: function (data) {
var errorObject = JSON.parse(data);
//Platform.LoadingPanelHide();
alert('There was a problem sending the email message to the individual selected.\n\n' + errorObject.responseText.message);
}
});
然后没有达到该方法,而是收到带有以下 JSON 响应的 HttpResonseCode.OK:
{
"result": null,
"success": false,
"error": {
"code": 0,
"message": "An internal error occured during your request!",
"details": null,
"validationErrors": null
},
"unAuthorizedRequest": false
}
对于我的一生,我无法弄清楚为什么会发生这种情况。有没有人有任何见解。
更新
这是 POST 请求。
还有异常日志:
ERROR 2015-01-29 15:51:08,250 [17 ] Default - Processing of the HTTP request resulted in an exception. Please see the HTTP response returned by the 'Response' property of this exception for details.
System.Web.Http.HttpResponseException: Processing of the HTTP request resulted in an exception. Please see the HTTP response returned by the 'Response' property of this exception for details.
at System.Web.Http.ModelBinding.FormatterParameterBinding.ReadContentAsync(HttpRequestMessage request, Type type, IEnumerable`1 formatters, IFormatterLogger formatterLogger, CancellationToken cancellationToken)
at System.Web.Http.ModelBinding.FormatterParameterBinding.ReadContentAsync(HttpRequestMessage request, Type type, IEnumerable`1 formatters, IFormatterLogger formatterLogger)
at System.Web.Http.ModelBinding.FormatterParameterBinding.<ExecuteBindingAsyncCore>d__0.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.GetResult()
at System.Web.Http.Controllers.HttpActionBinding.<ExecuteBindingAsyncCore>d__0.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.GetResult()
at System.Web.Http.Controllers.ActionFilterResult.<ExecuteAsync>d__2.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at System.Runtime.CompilerServices.TaskAwaiter`1.GetResult()
at System.Web.Http.Controllers.ExceptionFilterResult.<ExecuteAsync>d__0.MoveNext()
更新 #2
我现在采用了使用 DTO 的建议方法,如下所示:
var aMessageInfo = {
subject: Base64.encode($("#txtSendEmailSubject").val()),
body: Base64.encode($("#txtSendEmailBody").val())
};
$.support.cors = true;
$.ajax({
cache: false,
url: '/api/EmailActivities/Dono2',
type: "POST",
dataType: "json",
contentType: "application/json; charset=utf-8",
data: JSON.stringify(aMessageInfo),
success: function (callback) {
//Platform.LoadingPanelHide();
alert("Successfully sent the email.");
},
error: function (data) {
var errorObject = JSON.parse(data);
//Platform.LoadingPanelHide();
alert('There was a problem sending the email message to the individual selected.\n\n' + errorObject.responseText.message);
}
});
然后在 WebAPI 中,如果我只有:
public class EmailActivitiesController : ApiController
{
[HttpPost]
public HttpResponseMessage Dono2(MessageInfo aMessageInfo)
{
}
}
但只要我也有 EmailAClientWithNewMailMessage 作为方法:
public class EmailActivitiesController : ApiController
{
[HttpPost]
public HttpResponseMessage Dono2(MessageInfo aMessageInfo)
{
}
[HttpPost]
public HttpResponseMessage EmailAClientWithNewMailMessage(FormDataCollection aFormData)
{
}
我得到错误:
{
"message":"An error has occurred.",
"exceptionMessage":"Multiple actions were found that match the request: \r\nDono2 on type MakersLane.WebApi.Controllers.EmailActivitiesController\r\nEmailAClientWithNewMailMessage on type MakersLane.WebApi.Controllers.EmailActivitiesController",
"exceptionType":"System.InvalidOperationException",
"stackTrace":" at System.Web.Http.Controllers.ApiControllerActionSelector.ActionSelectorCacheItem.SelectAction(HttpControllerContext controllerContext)\r\n at System.Web.Http.Controllers.ApiControllerActionSelector.SelectAction(HttpControllerContext controllerContext)\r\n at Abp.WebApi.Controllers.Dynamic.Selectors.AbpApiControllerActionSelector.SelectAction(HttpControllerContext controllerContext)\r\n at System.Web.Http.ApiController.ExecuteAsync(HttpControllerContext controllerContext, CancellationToken cancellationToken)\r\n at System.Web.Http.Dispatcher.HttpControllerDispatcher.<SendAsync>d__1.MoveNext()"
}
现在,虽然控制器 Dono2 和 EmailClientWithNewMessage 上有两个操作,但我不明白为什么不能将它们区分开来,因为它们显然具有不同的名称,尽管它们都有一个参数,但它们的名称不同并且属于不同的类型。
谁能解释为什么会这样?
【问题讨论】:
-
您可以发布通过网络发送的 HTTP 请求吗?
-
@JoelGregory 添加了出现在电线上的 FireBug....如果您想要其他内容,请告诉我,我会添加它,
标签: c# jquery asp.net-web-api