【问题标题】:Passing data from a WinForms application to MVC3将数据从 WinForms 应用程序传递到 MVC3
【发布时间】:2011-12-14 19:13:55
【问题描述】:

我正在开发一个具有 Winforms 和 MVC3 Web 组件的应用程序。我们需要能够将大文件从桌面上传到网络。我尝试了各种 VB 2010 WebClient 和 FTP FileUpload 替代方案,但仍然遇到权限问题,即使我提供的用户 ID 和密码与成功将文件复制到同一 MVC3 站点的 FTP 应用程序使用的相同。

在寻找替代解决方案的过程中,我研究了使用 WCF,这对于这个特定的应用程序来说似乎也很复杂和有​​问题。

我最接近的解决方案是在 Winforms 应用程序上使用 HttpWebRequest。以下 VB 2010 和 C# 代码 (MVC3) 成功将 Filename 和 File 数据传递给 MVC3(InputStream 包含引用和 UrlEncode 数据,但包含此数据字段的类为空。(我也只传递了文件数据没有文件名,上传的文件是从 InputStream 成功创建的 - 但方法变量仍然是 null)。虽然我可以选择 InputStream,但我更喜欢更优雅的选择。

VB 2010 Winforms 方法:

    Public Shared Sub FileUpload(ByVal Filepath As String)
    Try
        Dim Host = System.Configuration.ConfigurationManager.AppSettings("Host")
        Dim url As String = Path.Combine(Host, "UI/FileUpload")
        Dim request As HttpWebRequest = HttpWebRequest.Create(url)
        request.Method = "POST"
        request.ContentType = "application/x-www-form-urlencoded"
        Dim Filename As String = Path.GetFileName(Filepath)
        Dim FileData As Byte() = GetFile2UploadData(Filepath)
        Dim data As String = String.Format("FileName={0}&FileData={1}", System.Web.HttpUtility.UrlEncode(Filename), System.Web.HttpUtility.UrlEncode(FileData))
        request.ContentLength = data.Length
        Using sr As StreamWriter = New StreamWriter(request.GetRequestStream)
            sr.Write(data)
        End Using
        Dim resp As HttpWebResponse = request.GetResponse
    Catch ex As Exception
        Throw New Exception(ex.Message)
    End Try
    Return
End Sub

MVC3 C# 控制器方法和类:

[HttpPost]
public ActionResult FileUpload(FileInformation fi) 
{
  try 
  {
      using (FileStream fs = new FileStream(Path.Combine(System.Web.Hosting.HostingEnvironment.MapPath("~/Users/User1"), fi.FileName), FileMode.Create)) {
        fs.Write(fi.FileData,0,fi.FileData.Length);
      }
      return Content("OK");
  }
  catch (Exception ex)
  {
      throw new Exception(ex.Message);
    }
}
public class FileInformation
{
  public string FileName;
  public byte[] FileData; 
}

我这几天一直在琢磨这个问题。赞赏您精辟的想法。

TIA

【问题讨论】:

    标签: vb.net winforms asp.net-mvc-3 c#-4.0


    【解决方案1】:

    如果您的桌面计算机与您的网站在同一个网络上,那么在网络服务器上创建一个共享目录并让您的桌面应用程序使用标准文件复制操作将文件获取到那里会更容易和更有效。

    然后,您可以通过与您已有的代码类似的代码通知 MVC 应用程序有一个新文件到达。

    【讨论】:

    • 我不知道效率。维护权限可能是上传文件夹的问题,因为任何人都可以看到/更改已上传的内容。当然,您可以设置一些水果权限以使文件夹只写。
    • @SimonHalsey:高效,我指的是网站的吞吐量,因为您将消除通过 IIS 的文件数据流。我们广泛使用这种方法,尽管文件传输实际上是通过仅限内部的应用程序服务器执行的,因此我们不必担心身份验证问题或对主网站的影响。
    • 感谢您的意见。由于上传文件的频率非常低,因此在上传过程中使用相同的 Web 服务器在性能方面并不令人担忧。我相信我需要研究 MVC 模型绑定,以便从 WinForms 等外部应用程序传递优雅的参数。
    【解决方案2】:

    WCF 服务对我来说会更好。您可以将服务上的参数指定为byte[]。您只需要设置最大请求和消息大小,对于 Web 应用程序也必须这样做。

    如果您要编写一个网络应用程序,我认为您需要将内容类型更改为 multipart/form-data。然后您应该可以查看Request.Files 集合

    【讨论】:

    • multipart/form-data 确实是这个 VB WinForms 应用程序的必经之路。我确实需要构造请求以符合包含边界规范的多部分表单数据的内容类型规则。在服务器端,Request.Files 做到了。感谢您的意见。
    猜你喜欢
    • 2012-03-28
    • 1970-01-01
    • 1970-01-01
    • 2012-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-15
    相关资源
    最近更新 更多