【问题标题】:No 'MediaTypeFormatter' is available to read an object of type 'String'没有“MediaTypeFormatter”可用于读取“String”类型的对象
【发布时间】:2012-05-08 03:40:32
【问题描述】:

我正在使用 ASP.NET Web API。如果没有参数,我的控制器中有一个动作可以正常工作。如果有参数,比如:

public string UploadFile(string actionType)

然后我的操作没有被调用,我收到以下消息,在 Fiddler 中查看:

没有“MediaTypeFormatter”可用于读取媒体类型为“multipart/form-data”的“String”类型的对象

global.asx中的路线如下:

"api/{controller}/{action}/{actionType}"

我正在使用 Jquery Post 来调用操作:

    function upload() {

        var actiontype = $("input:radio[name=actiontype]").val();
        var formData = new FormData($('form')[0]); 

        $.ajax({
            url: 'api/uploads/uploadfile/' + actiontype,
            type: 'POST',
            success: function (data) {
                $("#mydiv").append(data);
            },
            error: function (data) {
                $("#mydiv").append(data);
            },
            data: formData,
            cache: false,
            contentType: false, 
            processData: false
        });
    }; 

这是我的操作方法:

    public string UploadFile(string actionType)
    {
        if (Request.Content.IsMimeMultipartContent())
        {
            //Save file
            MultipartFormDataStreamProvider provider = new MultipartFormDataStreamProvider(HttpContext.Current.Server.MapPath("~/Files"));
            Request.Content.ReadAsMultipartAsync(provider);
        }

        return string.Format("Action {0} Complete!", actionType);
    }

这是一个已知问题,有解决方法吗?我怎样才能有一个带参数的简单动作?

【问题讨论】:

    标签: asp.net-web-api jquery-post


    【解决方案1】:

    假设您使用的是默认路由,看起来您发布的路径不正确。这是 MVC 开发人员似乎遇到的常见混淆(我知道我遇到过)。 MVC 使用默认路径,例如:/Controller/Action

    然而,在 Web API 的默认路由设置中,会跳过操作名称 (/api/Controller),然后根据需要通过 HTTP 动词名称 (post)、方法名称 (Post___) 和参数的交集找到方法。

    假设您有一个名为 Uploads 的 API 控制器,您应该有一个名为 PostUploadFile 的操作。

       $.ajax({
            url: 'api/uploads/',
            type: 'POST',
    

    注意事项...

    • 我以文本“发布...”开头您的操作名称,这很重要,名称的其余部分不重要
    • 您的帖子网址已缩短为控制器的名称。
    • 我更深入地解释了mapping here

    编辑

    显然您遇到了一些 WebAPI 问题。解决这个问题的方法是将“actionType”参数填充到一个简单的对象中,以便模型绑定可以接管。

    Rick Strahl 解释了这一点并some other binding oddities here。还有another SO question 解决了类似的问题。

    【讨论】:

    • 谢谢。实际上,我正在使用 Web 表单——我在全局文件中将路由模板定义为“api/{controller}/{action}/{actionType}”——它确实需要该操作。请记住,没有参数它可以正常工作,所以我怀疑它与它有关。
    • 网络表单..嗯?您的控制器是否继承自 ApiController ?使用 firebug/fiddler/whatever ... 请求标头Accept 中列出了什么?假设您期望 json 返回它应该是application/json。您可能需要 dataType: json 作为 ajax 调用的一部分。
    • 我的控制器确实继承自 apicontroller。在提琴手中,内容类型是“应用程序/json”。我编辑了我的 OP 以反映我当前的 ajax 调用。
    • 谢谢!您发布到 Rick 博客的第一个链接帮助了我。我使用了似乎有效的 querystring/ParseQueryString() 方法(没有操作参数)。感谢您的帮助。
    猜你喜欢
    • 1970-01-01
    • 2019-01-19
    • 1970-01-01
    • 2012-09-12
    • 2015-08-13
    • 2018-05-29
    • 2016-06-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多