Передача данных из приложения WinForms в MVC3 - PullRequest
0 голосов
/ 14 декабря 2011

Я работаю над приложением, имеющим веб-компонент Winforms и MVC3.Мы должны иметь возможность загружать большие файлы с рабочего стола в Интернет.Я пробовал различные варианты VB 2010 WebClient и FTP FileUpload, но продолжаю сталкиваться с проблемами прав доступа, даже несмотря на то, что предоставленный мной идентификатор пользователя и пароль те же, что и в приложении FTP, которое успешно копирует файлы на тот же сайт MVC3.

В своих попытках найти альтернативные решения я рассмотрел использование WCF, которое также кажется сложным и проблематичным для данного конкретного приложения.

Наиболее близкое решение, которое я нашел, использует HttpWebRequest на Winformsприложение.Следующий код VB 2010 и C # (MVC3) успешно передает данные Filename и File в MVC3 (InputStream содержит ссылки и данные UrlEncode, но класс, содержащий поля для этих данных, равен нулю. (Я также передал только данные файла).без имени файла и загруженный файл успешно создается из InputStream - но переменная метода все еще равна нулю.) Хотя я мог бы выделить 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; 
}

Я уже несколько дней жую эту проблему. Ваши острые идеи приветствуются.

ТИА

Ответы [ 2 ]

0 голосов
/ 14 декабря 2011

Служба WCF будет для меня лучше.Вы можете указать параметр сервиса как byte[].Вам просто нужно установить максимальный размер запроса и сообщения, который вы должны сделать и для веб-приложения.

Если вы собираетесь писать веб-приложение, я думаю, вам нужноизмените тип содержимого на multipart / form-data.После этого вы сможете просмотреть коллекцию Request.Files

.
0 голосов
/ 14 декабря 2011

Если ваши настольные компьютеры находятся в той же сети, что и ваш веб-сайт, было бы намного проще и эффективнее создать общий каталог на веб-сервере, и ваши настольные приложения используют стандартные операции копирования файлов для получения файлов.

Затем вы можете уведомить приложение MVC о том, что поступил новый файл, с помощью кода, аналогичного тому, который у вас уже есть.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...