无法调用服务器端 webmethod 函数

Posted

技术标签:

【中文标题】无法调用服务器端 webmethod 函数【英文标题】:Unable to call server side webmethod function 【发布时间】:2014-10-21 05:05:08 【问题描述】:

我正在使用summernote,我想将图像上传到我的网络服务器。下面是我正在使用的代码

默认.aspx

<script type="text/javascript">
    $(document).ready(function () 
        $('#summernote').summernote(
            onImageUpload: function (files, editor, $editable) 
                alert('image?');
                var formData = new FormData();
                formData.append("file", files[0]);

                $.ajax(
                    url: "Default.aspx/UploadImage",
                    data: formData,
                    type: 'POST',
                    cache: false,
                    contentType: false,
                    processData: false,
                    success: function (imageUrl) 
                        alert(imageUrl);
                        if (!imageUrl) 

                            // handle error

                            return;
                        

                        editor.insertImage($editable, imageUrl);
                    ,
                    error: function () 
                        alert('error');
                        // handle error
                    
                );
                console.log('image upload:', files, editor, $editable);
            
        );
    );
</script>

默认.asp.cs

[System.Web.Services.WebMethod]
    public static string UploadImage(HttpPostedFileBase file)
    
        //Saving to Server

        return imageUrl;
    

但它没有调用服务器端函数。此外,alert(imageUrl) 正在给我完整的页面 html

我哪里错了?

使用网络信息更新问题(谷歌浏览器)

编辑 2

建议后更新

代码

 url: "About.aspx/UploadImage",
                   data: "multipart/form-data",
                   type: 'POST',
                   cache: false,
                   contentType: "application/json",

错误

注意:我已将页面从 Default.aspx 更改为 about.aspx(但代码相同)

【问题讨论】:

检查 URL - “Default.aspx/UploadImage”,这可能是问题所在。为了进一步调试打开 chrome 网络选项卡 (F12) 并检查状态代码和 AJAX 调用的响应。 附带问题,您持有该方法的类是否具有[ScriptService] 属性? @abhi 我已经上传了我的问题 POST 调用的响应是什么? 400 bad request 也是同一个呼叫的一部分吗? @Holybreath 在 default.aspx.cs 页面中 public partial class _Default : Page 【参考方案1】:

WebMethod 或“页面方法”expect contentType: "application/json;

其他参考:Scott Guthrie - JSON Hijacking and How ASP.NET AJAX 1.0 Avoids these Attacks:

ASP.NET 为基于 GET 和 POST 的 ASP.NET AJAX Web 方法强制实施了一个内置的保护验证层,即不管使用的 HTTP 动词如何,ASP.NET 总是要求将 HTTP Content-Type 标头设置为值 application/json。如果不发送此内容类型标头,ASP.NET AJAX 将拒绝服务器上的请求。

这就是为什么您的 alert 返回页面 (html),您的调用 成功 调用了 page (default.aspx),但 webmethod不 被调用。

见this for direction/possible solution。


我认为您感到困惑,可能是我的错。我会尽量简化:

链接中的建议是使用 WebMethod。 为了发送文件,您的contentType 必须是multipart/form-data 查看相关问题:jquery contentType false 但如上所述,WebMethods 要求 contentTypeapplication/json 它不适用于 WebMethods(因此链接建议使用通用处理程序)。

第...

【讨论】:

感谢您的回答。我尝试使用 contentType:“application/json; charset=utf-8”,也尝试使用 contentType:“application/json”。但现在它将进入错误部分。还有什么我错了吗? @Zerotoinfinite 请参阅link above 了解可能的替代方案/解决方案 - 回复:根据您的代码,您似乎需要发送 multipart/form-data(它不适用于 PageMethods)

以上是关于无法调用服务器端 webmethod 函数的主要内容,如果未能解决你的问题,请参考以下文章

C#中的[WebMethod]的用法

C#中的[WebMethod]的用法

使用 ajax 调用 C# 事件不起作用

从 javascript 调用 webmethod 时出现 ASP.NET 500 内部服务器错误

ajax发送FormData c# WebMethod

webService服务器端搭建