Ajax发送FormData到C# WebMethod

7
我有一个带文件输入和一个按钮的表单,当我按下按钮时,文件应该发送到服务器端。
当我将文件发送到服务器时,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 width="100%" 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);
            }
        });
};

The 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;
}

谢谢。


不,返回成功。 - Ivan Arias
请用console.log(result)代替alert输出结果,检查对象是否具有任何属性。 - mybirthname
@IvanArias:你有另一个同名的UploadBlock方法,可以接受一个参数吗? - DinoMyte
1
显然,由于Ajax调用成功,至少Web服务器正在响应指示成功的HTTP代码。如果它不会在断点处停止,那么您可能有另一个被调用的方法。 - Nikkster
1
@sandeepnagabhairava 嗯...不,最后我没有其他办法,只能使用一个外部的MVC页面来完成这个过程,然后一切都可以正常工作,抱歉。 - Ivan Arias
显示剩余5条评论
1个回答

3

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

WebMethods需要一个application/json的content-type - https://stackoverflow.com/a/25531233/2913189

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

使用处理程序,您可以在ajax调用中将内容类型设置为"false",并且不会出现任何问题。我将信息作为FormData发送,并且在处理程序中使用context.Request.Files和context.Request轻松消耗它。

ajax调用片段:

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");
        }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接