Dropzone.js/C#web服务。上传给出HTTP动词POST用于访问路径

问题描述:

我想弄清楚如何让dropzone.js与基于C#的Web服务一起工作。但我得到的问题是,在我选择要上传的文件后,我遇到了404错误。Dropzone.js/C#web服务。上传给出HTTP动词POST用于访问路径

这些是我已经完成的步骤:在VS2012中,我开始了一个空的MVC4应用程序。然后,我通过NuGet添加和index.html,dropzone.js和jquery(不知道dropzone是否需要它,只是添加它来保存)。基于dropzone.js的网站上的例子,我写了未来的html代码:

<!DOCTYPE html> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
<head> 
    <link href="CSS/FileUploader.css" rel="stylesheet" /> 
    <script src="Scripts/jquery-2.0.2.min.js"></script> 
    <script src="Scripts/DropZone.js"></script> 
    <script> 

    </script> 
    <title>File Uploader test</title> 
</head> 
<body> 
    <form action="/FileUpload/FileUploadController" 
      class="dropzone" <!-- this css class contains: background-color: yellow; --> 
      id="my-awesome-dropzone"></form> 
</body> 
</html> 

我添加了一个路由的路由配置在RouteConfig.cs这样的:

public static void RegisterRoutes(RouteCollection routes) 
    { 
     routes.MapRoute(
      name: "FileUpload", 
      url: "FileUpload/FileUploadController", 
      defaults: new 
      { 
       controller = "FileUploadController", 
       action = "FileUpload" 
      } 
     ); 
    } 

而且我的控制器看起来是这样的:

public class FileUploadController : Controller 
{ 
    [HttpPost] 
    public ActionResult FileUpload(IEnumerable<HttpPostedFileBase> files) 
    { 
     return null; //Breakpoint here 
    } 
} 

我把一个断点“回归零”行只是为了测试方法是否正确调用。当我运行代码并打开html页面时,dropzone控件可以正常工作。但是,当我选择一个文件时,会显示以下错误:不允许使用用于访问路径'/ FileUploadController/FileUpload'的HTTP动词POST。我无法弄清楚为什么。此外,代码没有打破断点,所以我猜这个方法没有正确调用。

我在这里做错了什么?

+0

嗨,不幸的是,我不能帮助C#。看起来就好像Dropzone的一切工作正常。只需确保,您可以在Dropzone上设置'forceFallback'选项,以便它回退到正常的文件输入元素。这样你就知道你正在处理C#和HTML,而且它们之间没有JS。 – enyo

+0

嘿,thnx回答。在搜索405错误实际上意味着什么后,我认为这是一个C#问题(或配置文件问题)。我也试过它没有JS(所以只是一个HTML表单,其中有2个输入标签,一个带有类型文件,另一个带有类型提交)。表单操作是“/ FileUploadController/FileUpload”,方法是“post”。但我得到同样的错误,所以我不认为它是由dropzone.js本身造成的。 – Cornelis

+0

我犯了一个错误,我没有看到目前在url部分。我在url属性的路由配置中更改了FileUploadController和FileUpload。太糟糕了,它不能解决我的问题,虽然我现在得到一个不同的错误:我得到一个404错误,而不是一个405. – Cornelis

最后,我想出了我做错了什么。虽然我需要一个例子来解决它......没有它,我永远不会弄明白,因为解决方案一开始就没有意义。让我分享这个解决方案,以防你不知道。

首先,我有我的控制器类看起来像这样(也许在一些地方不同的名字)

public class FileUploadController : Controller 
{ 
    [HttpPost] 
    public ActionResult UploadFiles(IEnumerable<HttpPostedFileBase> files) 
    { 
     return Json("All files have been successfully stored."); 
    } 
} 

和映射到像这样

 routes.MapRoute(
      "Uploader", 
      "FileUploadController/UploadFiles/", 
      new { controller = "FileUploadController", action = "UploadFiles" } 
     ); 

在我的第一个观点,无可厚非,所有名字匹配等等。但是,由于我不知道的原因,当您尝试调用http:// FileUploadController/UploadFiles时,.NET代码将“控制器”添加到url中的控制器名称部分。所以,它试图寻找FileUploadControllerController。但是我没有那个班,所以我得到了我在前一篇文章中提到的错误。当我适应我的路由映射到

 routes.MapRoute(
      "Uploader", 
      "FileUpload/UploadFiles/", //not sure if removing Controller here is required 
      new { controller = "FileUpload", action = "UploadFiles" } 
     ); 

代码工作,UploadFiles被调用,我得到的JSON字符串返回。为了测试我的理论,我在两个地方都添加了Controller(当然也是在html文件中),所以我的类被命名为FileUploadControllerController,并且它再次运行。

我想微软试图强制使用正确的名称约定,迫使我们在类名末尾加上Controller。其他原因我想不出来。

+0

实际上,frameword不添加另一个“控制器”到您的控制器名称,框架删除它,因为sufix“Controler”是一个保留字。例如,如果我有一个控制器“HomeController”,我只需要通过“Home”给他打电话。 –