Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/263.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/85.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# WebAPI中未访问带有FormData的HTTP Post WebForms 4.5.1、WebAPI 2 基于ABP样板文件(版本0.4.1.0)的项目_C#_Jquery_Asp.net Web Api - Fatal编程技术网

C# WebAPI中未访问带有FormData的HTTP Post WebForms 4.5.1、WebAPI 2 基于ABP样板文件(版本0.4.1.0)的项目

C# WebAPI中未访问带有FormData的HTTP Post WebForms 4.5.1、WebAPI 2 基于ABP样板文件(版本0.4.1.0)的项目,c#,jquery,asp.net-web-api,C#,Jquery,Asp.net Web Api,我有一个Web API控制器,定义如下: [HttpPost] public class EmailActivitiesController : ApiController { public HttpResponseMessage EmailAClientWithNewMailMessage(FormDataCollection aFormData) { } } var aMessageInfo = { subject: Base64.encod

我有一个Web API控制器,定义如下:

[HttpPost]
public class EmailActivitiesController : ApiController
{
    public HttpResponseMessage EmailAClientWithNewMailMessage(FormDataCollection aFormData)
    {
    }
}
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);
            }
        });
通过以下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方法。但是,只要我填写以下格式数据:

    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);
        }
    });
然后,没有到达该方法,我收到了一个HttpResonseCode.OK,带有以下JSON响应:

{
"result": null,
"success": false,
"error": {
"code": 0,
"message": "An internal error occured during your request!",
"details": null,
"validationErrors": null
},
"unAuthorizedRequest": false
}
就我的一生而言,我无法理解为什么会发生这种情况。有人有什么见解吗

更新

这是邮件请求

以及异常日志:

    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()
然后在WebAPI中,如果我只有:

   public class EmailActivitiesController : ApiController
    {
    [HttpPost]
        public HttpResponseMessage Dono2(MessageInfo aMessageInfo)
        {
        }
    }
但一旦我也有了EmailClientWithNewMailMessage作为一种方法:

   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()"
}
{
“消息”:“发生错误。”,
“exceptionMessage”:“找到多个与请求匹配的操作:\r\nMakerslane.WebApi.Controllers.EmailActivitiesController类型上的nDono2\r\nMakerslane.WebApi.Controllers.EmailActivitiesController类型上的NemailClientWithNewMailMessage”,
“异常类型”:“System.InvalidOperationException”,
“stackTrace”:“位于System.Web.Http.Controllers.ApiControllerActionSelector.ActionSelector或CacheItem.SelectAction(HttpControllerContext controllerContext)\r\n位于System.Web.Http.Controllers.ApiControllerActionSelector.SelectAction(HttpControllerContext controllerContext)\r\n在Abp.WebApi.Controllers.Dynamic.Selectors.abPapControllerActionSelector.SelectAction(HttpControllerContext controllerContext)\r\n在System.Web.Http.ApiController.ExecuteAsync(HttpControllerContext controllerContext,CancellationToken CancellationToken)\r\n在System.Web.Http.Dispatcher.HttpControllerDispatcher.d\u 1.MoveNext()
}
现在,虽然控制器Dono2和EmailClientWithNewMessage上有两个操作,但我不明白为什么不能区分它们,因为它们显然有不同的名称,尽管它们都有一个参数,但它们的名称不同,类型也不同

有人能解释为什么会发生这种情况吗?

我认为这段代码覆盖了结果

try
                    {
                        if (task.Result == null)
                        {
                            return new AjaxResponse();
                        }

                        if (task.Result is AjaxResponse)
                        {
                            return task.Result;
                        }

                        return new AjaxResponse(task.Result);
                    }

我认为这段代码覆盖了结果

try
                    {
                        if (task.Result == null)
                        {
                            return new AjaxResponse();
                        }

                        if (task.Result is AjaxResponse)
                        {
                            return task.Result;
                        }

                        return new AjaxResponse(task.Result);
                    }

你看过Logs/Logs.txt文件了吗?它将在那里抛出异常

干杯
Jeff

您是否查看了Logs/Logs.txt文件?它将在那里抛出异常

干杯
Jeff

我不在windows计算机上,因此现在无法测试此写入操作,但我将提供下面的替代解决方案。从POST中发送的查询字符串到
FormDataCollection
的映射存在问题,我认为可以通过使用如下JSON对象来解决:

{aFormData:{aMessageInfo:“test”}

但我不能证实。我相信下面的解决方案会更好,所以除非您必须使用FormDataCollection,否则请使用它

我建议使用视图模型,而不是
FormDataCollection
,因为值的映射变得单调乏味:

public class Message
{
    public string Client { get; set; }
    public string Content { get; set; }
}
然后将控制器更改为:

public HttpResponseMessage EmailAClientWithNewMailMessage(Message data)
{
    // use the deserialised object here
    return data.Client;
}
您的jquery如下所示(注意添加了content-type参数和JSON.stringify调用):


我不在windows计算机上,因此现在无法测试此写操作,但我将提供下面的替代解决方案。从POST中发送的查询字符串到
FormDataCollection
的映射存在问题,我认为可以通过使用如下JSON对象来解决:

{aFormData:{aMessageInfo:“test”}

但我不能证实。我相信下面的解决方案会更好,所以除非您必须使用FormDataCollection,否则请使用它

我建议使用视图模型,而不是
FormDataCollection
,因为值的映射变得单调乏味:

public class Message
{
    public string Client { get; set; }
    public string Content { get; set; }
}
然后将控制器更改为:

public HttpResponseMessage EmailAClientWithNewMailMessage(Message data)
{
    // use the deserialised object here
    return data.Client;
}
您的jquery如下所示(注意添加了content-type参数和JSON.stringify调用):


我认为乔尔是对的。我在将字符串作为参数传入时遇到了问题,因此将所有输入打包到DTO对象中,效果很好

干杯
杰夫

我认为乔尔是对的。我在将字符串作为参数传入时遇到了问题,因此将所有输入打包到DTO对象中,效果很好

干杯
Jeff

问题在于:ABP系统配置为仅处理JSON数据。当您这样更改代码时,它会起作用:

$.ajax({
    cache: false,
    url: '/api/EmailActivities/EmailAClientWithNewMailMessage',
    type: "POST",
    contentType: 'application/json',
    dataType: "json",
    data: JSON.stringify({ aMessageInfo: 'test' }),
    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);
    }
});
我添加了contentType。通过这种方式,方法被调用,但表单数据不会到达方法。也许FormDataCollection不喜欢JSON帖子

为什么不使用简单的DTO类而不是FormDataCollection?这对于ABP项目来说更为自然

在AbpWebApiModule中,它清除所有格式化程序并添加JSON和纯文本

        private static void InitializeFormatters()
        {
            GlobalConfiguration.Configuration.Formatters.Clear();
            var formatter = new JsonMediaTypeFormatter();
            formatter.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();
            GlobalConfiguration.Configuration.Formatters.Add(formatter);
            GlobalConfiguration.Configuration.Formatters.Add(new PlainTextFormatter());
        }
也许您可以使用GlobalConfiguration.Configuration.Formatters.Add来添加其他格式化程序

我是如何发现问题的?ABP定义了处理异常的事件(从v0.3.2开始):

这可以帮助您查找错误

EventBus.Default.Register<AbpHandledExceptionData>(
    data =>
    {
        //use data.Exception to see exception details
    });
EventBus.Default.Register(
数据=>
{
//使用data.Exception查看异常详细信息
});

问题在于:ABP系统配置为仅处理JSON数据。当您这样更改代码时,它会起作用:

$.ajax({
    cache: false,
    url: '/api/EmailActivities/EmailAClientWithNewMailMessage',
    type: "POST",
    contentType: 'application/json',
    dataType: "json",
    data: JSON.stringify({ aMessageInfo: 'test' }),
    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);
    }
});
我添加了contentType。通过这种方式,方法被调用,但表单数据不会到达方法。也许FormDataCollection不喜欢JSON帖子

为什么不使用简单的DTO类而不是FormDataCollection?这对于ABP项目来说更为自然

在AbpWebApiModule中,它清除所有格式化程序并添加JSON和纯文本

        private static void InitializeFormatters()
        {
            GlobalConfiguration.Configuration.Formatters.Clear();
            var formatter = new JsonMediaTypeFormatter();
            formatter.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();
            GlobalConfiguration.Configuration.Formatters.Add(formatter);
            GlobalConfiguration.Configuration.Formatters.Add(new PlainTextFormatter());
        }
也许您可以使用GlobalConfiguration.Configuration.Formatters.Add来添加其他格式化程序

我是如何发现问题的?ABP定义了处理异常的事件(从v0.3.2开始):

这可以帮助您查找错误

EventBus.Default.Register<AbpHandledExceptionData>(
    data =>
    {
        //use data.Exception to see exception details
    });
EventBus.Default.Register(
数据=>
{
//美国