- WebForms 4.5.1, WebAPI 2
- Проект основан на ABP шаблонный (http://aspnetboilerplate.com/ версия 0.4.1.0)
У меня есть контроллер Web API определяется как следующим образом:HTTP Post с FormData не достигается в WebAPI
[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);
}
});
то метод не будет достигнуто, и я receieve вместо этого HttpResonseCode.OK со следующим ответом JSON:
{
"result": null,
"success": false,
"error": {
"code": 0,
"message": "An internal error occured during your request!",
"details": null,
"validationErrors": null
},
"unAuthorizedRequest": false
}
Для жизни меня я не может понять, почему это происходит. Кто-нибудь получил какие-либо идеи.
UPDATE
Вот запрос 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()
UPDATE # 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 того, что появляется на проводе .... Если вы хотите что-то еще, дайте мне знать, и я добавлю его, – TheEdge