将表单数据发布到MVC控制器并获取404未找到错误

时间:2016-11-22 23:00:43

标签: c# forms asp.net-mvc-4 curl

我在C#中有一个MVC项目,在我的一个控制器中,我接受来自外部源的HTTP POST数据并尝试保存文件。我已经尝试了许多不同的方法签名,但我有一点时间搞清楚要使用哪一个。我知道他们不能工作,因为每次我尝试发布到URL时,我的IIS日志中都会出现404错误。

我尝试过的一些事情是

public ActionResult Index(FormCollection forms)
public ActionResult Index(FormCollection forms, HttpPostedFileBase files)
public ActionResult Index()

我正在将请求写入失败的请求日志,以尝试获取更多信息,我看到标题是:

Content-Length: 158293970
Content-Type: multipart/form-data; boundary=--------------------9228c56ead9fc97c
Accept-Encoding: gzip
Host: myhostinformationhere
User-Agent: SecurityCenter/5.3.1 (201604012350)

有什么建议吗?

我发现的更多信息。发布到我的网站的代码是使用curl的php代码。在没有透露太多供应商源代码的情况下,我看到他们正在做的一些事情可能有助于解决问题。标题代码是

$sendHeaders = array ("Except:","X-SecurityCenter: $uuid", "Accept: application/html; charset=utf-8",);

他们也在添加像这样的帖子

$postFields['reportType'] = $reportType;
$postFields['reportContent'] = curl_file_create($pathInfo['filepath'],$pathInfo['type'],basename($pathInfo['filepath']));

我已将代码更新为以下内容,但我现在在日志中收到超时错误

public ActionResult Index(HttpPostedFileBase upload)
{
  if (upload != null && upload.ContentLength > 0)
  {
    var fileName = Path.GetFileName(upload.FileName);
    var path = Path.Combine(Server.MapPath(~/Files/Uploads"), fileName);
    upload.SaveAs(path);
  }

  return View();
}

因此,通过上面的代码,我已经向fiddler确认了一个文件被捕获并上传到正确的目录。现在要弄清楚如何从客户端软件中发布帖子。

2 个答案:

答案 0 :(得分:0)

如果我理解这一点,您应该在Controller中添加另一个Action。您不应该使用“索引”操作来尝试发布数据。尝试这样的事情。

[HttpPost]
public ActionResult Save( HttpPostedFileBase file )
{
   if( file != null )
   {
   }

   // Return something to signify success/failure
}

答案 1 :(得分:0)

以下是您可以尝试的一些事项。

尝试这样的动作方法:

public ActionResult Index(HttpPostedFileBase files)
{
    // your work...
}

您需要做的下一件事是检查请求的请求正文;这应该在你的IIS日志中。复制该主体,然后使用Fiddler创建该确切的请求。 Here是关于如何使用Fiddler发布帖子请求的教程。

在MVC项目的Global.asax.cs文件中,输入以下代码:

/// <summary>
/// Handles the HttpApplication's Error event.
/// </summary>
protected void Application_Error() 
{
     // Put a breakpoint here to give you an idea of what is going wrong.
     Exception exception = this.Server.GetLastError();
}

您也可以使用MVC route debugger来帮助您。

总之,继续尝试并让它与Fiddler合作,提供您从供应商处获得的确切要求。完成后,请再次尝试使用供应商产品。

您还可以使用Fiddler捕获来自供应商产品的请求,并使用该请求检查请求。