没有'MediaTypeFormatter'可用于读取'String'类型的对象

时间:2012-05-06 23:33:46

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

我正在使用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);
    }

这是一个已知问题,有一个解决方法吗?如何使用参数进行简单的操作?

1 个答案:

答案 0 :(得分:1)

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

但是,在Web API的默认路由设置中,将跳过操作名称(/api/Controller),然后通过HTTP谓词名称(post),方法名称(Post ___)和参数if的交集找到该方法。必要。

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

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

有些事需要注意......

  • 我用“Post ...”文本开始了你的行动名称,这很重要,名字的其余部分没有
  • 您的帖子网址缩短为控制器的名称。
  • 我更深入地解释了mapping here

修改

显然你正在体验WebAPI的异味。解决这个问题的方法是将“actionType”参数填充到一个简单的对象中,这样模型绑定就可以接管。

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