ajax发送FormData c# WebMethod

Posted

技术标签:

【中文标题】ajax发送FormData c# WebMethod【英文标题】:ajax send FormData c# WebMethod 【发布时间】:2021-04-14 03:00:27 【问题描述】:

我有一个带有文件输入和一个按钮的表单,当我按下按钮时,文件应该转到服务器端。

当我向服务器发送文件时,ajax 响应是成功的,永远不要在我使用的 c# webmethod 断点处停止。我做错了什么?

表单:(Default.aspx)

<form id="form1" runat="server" enctype="multipart/form-data">
    <div align="center" class="divBody">
        <div id="controlHost">
            <div id="outerPanel">
                <table  cellpadding="2" cellspacing="5">
                    <tr align="left">
                        <td colspan="2">
                            <span class="message">Seleccione el archivo que desea subir</span>
                        </td>
                    </tr>
                    <tr align="left">
                        <td valign="top">
                            <input type="file" id="FileInput" multiple="false" class="fileInput" />
                        </td>
                        <td align="right">
                            <input type="button" id="btnUpload" name="btnUpload" value="Upload" onclick="sendFile();" class="button" />
                        </td>
                    </tr>
                </table>
            </div>
        </div>
    </div>
</form>

脚本:(Default.aspx)

function sendFile() 
    var data = new FormData();
    var file = $("#FileInput")[0].files[0];
    data.append("name", file.name);
    data.append("size", file.size);
    data.append("type", file.type);
    data.append("file", file);

    $.ajax(
            type: "POST",
            async: true,
            url: "Default.aspx/UploadBlock",
            data: data,
            cache: false,
            contentType: false,
            processData: false,
            success: function (result) 
                alert("Success: " + result);
            ,
            error: function (xhr, status) 
                alert("An error occurred: " + status);
            
        );
;

WebMethod: (Default.aspx.cs)

[WebMethod(EnableSession = true)]
[ScriptMethod(ResponseFormat = ResponseFormat.Json)]
public static Respuesta UploadBlock()

  Respuesta res = new Respuesta  Success = true, Message = "OK" ; //Break point here
  return res;

谢谢。

【问题讨论】:

返回调用是否命中错误块? 不,返回成功 而不是alert写console.log(result),看看对象是否有任何属性。 很明显,既然Ajax调用成功了,至少web服务器响应了一个HTTP代码,表示成功。如果它不会在断点处停止,那么您可能正在调用另一个方法。 @sandeepnagabhairava emmm...不,最后我没有其他方法可以使用外部 MVC 页面来执行该过程,然后一切正常,抱歉 【参考方案1】:

如果有人像我一样遇到这个......

WebMethods 期望内容类型为 application/json - https://***.com/a/25531233/2913189

如果你将 content-type 设置为 false,ajax 调用将不会命中你的 webmethod,它会转到 page_load。似乎还有其他一些方法可以通过对文件进行字符串化来完成文件上传,但我无法获得有效的解决方案,所以我只是创建了一个 HttpHandler (.ashx) 文件,编译并在 web.config 中添加了引用。

使用处理程序,您可以在 ajax 调用中将 content-type 设置为“false”,不会有任何问题。我将信息作为 FormData 发送,它很容易在处理程序中使用 context.Request.Files 和 context.Request

ajax调用的sn-p:

var fileControl = $("#file")[0].files[0];
var formData = new FormData();
formData.append("employeeId", employeeId);
formData.append("userfile", fileControl);
formData.append("filetype", uploadTypeSelect.val());

$.ajax(
                        type: "POST",
                        contentType: false,
                        url: "/Handlers/MyUploadHandler.ashx",
                        processData: false,
                        data: formData,
                        success: function (msg) 
                            //do something
                        ,
                        error: function (xhr, ajaxOptions, thrownError) 
                            //do something
                        
                    );

处理程序片段:

public override async Task ProcessRequestAsync(HttpContext context)
        
            context.Response.ContentType = "text/plain";

            var uploadedFile = context.Request.Files[0]; //only uploading one file
            var fileName = uploadedFile.FileName;
            var fileExtension = uploadedFile.ContentType;
            var folder = "MyOneDriveFolder";

            //this is an method written elsewhere to upload a file to OneDrive
            var uploaded = await OneDriveUpload.UploadDocument(filename,uploadedFile.InputStream, folderName, 0);

            context.Response.Write("Whatever you like");
        

【讨论】:

以上是关于ajax发送FormData c# WebMethod的主要内容,如果未能解决你的问题,请参考以下文章

c# 后台接收formdata对象

使用 jQuery.ajax 发送 multipart/formdata

使用 jQuery.ajax 发送 multipart/formdata

如何在 Flask 中接受通过 ajax 发送的 FormData?

ColdFusion无法读取Ajax发送的FormData

无法使用 Angular 7 中的 FormData 发送带有 Ajax 的文件