Compact Framework-通过REST上传文件

Compact Framework-通过REST上传文件,rest,compact-framework,Rest,Compact Framework,我正在寻找通过REST将文件从compact框架传输到服务器的最佳方法。我有一个使用.NETWebAPI创建的web服务。我看了一些关于发送文件的问题和其他网站,但没有一个能满足我的需要 我正在尝试将媒体文件从WM 6和6.5设备发送到我的REST服务。虽然大多数文件小于300k,但也有少数文件可能是2-10兆左右。有人有我可以用来做这件事的片段吗 谢谢 我认为这是发送文件的最低要求: using (var fileStream = File.Open(@"\file.txt", FileMod

我正在寻找通过REST将文件从compact框架传输到服务器的最佳方法。我有一个使用.NETWebAPI创建的web服务。我看了一些关于发送文件的问题和其他网站,但没有一个能满足我的需要

我正在尝试将媒体文件从WM 6和6.5设备发送到我的REST服务。虽然大多数文件小于300k,但也有少数文件可能是2-10兆左右。有人有我可以用来做这件事的片段吗


谢谢

我认为这是发送文件的最低要求:

using (var fileStream = File.Open(@"\file.txt", FileMode.Open, FileAccess.Read, FileShare.Read))
{
    HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create("http://www.destination.com/path");
    request.Method = "POST"; // or PUT, depending on what the server expects
    request.ContentLength = fileStream.Length; // see the note below
    using (var requestStream = request.GetRequestStream())
    {
        int bytes;
        byte[] buffer = new byte[1024]; // any reasonable buffer size will do
        while ((bytes = fileStream.Read(buffer, 0, buffer.Length)) > 0)
        {
            requestStream.Write(buffer, 0, bytes);
        }
    }

    try
    {
        using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
        {

        }
    }
    catch (WebException ex)
    {
        // failure
    }
}
注意:HTTP需要一种方法来知道何时“完成”发送数据。有三种方法可以实现这一点:

  • 设置示例中使用的
    request.ContentLength
    ,因为我们在发送任何内容之前就知道文件的大小
  • 设置
    request.SendChunked
    ,以发送数据块,包括它们各自的大小
  • 您还可以设置
    request.AllowWriteStreamBuffering
    写入内存缓冲区,但我不建议在紧凑型框架上浪费那么多内存
      我认为这是发送文件的最低要求:

      using (var fileStream = File.Open(@"\file.txt", FileMode.Open, FileAccess.Read, FileShare.Read))
      {
          HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create("http://www.destination.com/path");
          request.Method = "POST"; // or PUT, depending on what the server expects
          request.ContentLength = fileStream.Length; // see the note below
          using (var requestStream = request.GetRequestStream())
          {
              int bytes;
              byte[] buffer = new byte[1024]; // any reasonable buffer size will do
              while ((bytes = fileStream.Read(buffer, 0, buffer.Length)) > 0)
              {
                  requestStream.Write(buffer, 0, bytes);
              }
          }
      
          try
          {
              using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
              {
      
              }
          }
          catch (WebException ex)
          {
              // failure
          }
      }
      
      注意:HTTP需要一种方法来知道何时“完成”发送数据。有三种方法可以实现这一点:

      • 设置示例中使用的
        request.ContentLength
        ,因为我们在发送任何内容之前就知道文件的大小
      • 设置
        request.SendChunked
        ,以发送数据块,包括它们各自的大小
      • 您还可以设置
        request.AllowWriteStreamBuffering
        写入内存缓冲区,但我不建议在紧凑型框架上浪费那么多内存
      您能否详细说明其他问题/网站的建议中哪些似乎不起作用?否则,这里的答案很可能也不适用于您。当然,我看到了一些他们发送xml或文本文件的地方,这些文件被序列化为字符串。或者一些(比如protobuf)将数据结构序列化到文件中。我也看到过一些使用多部分协议的例子,但是compact框架不支持这一点。我知道,大多数例子都涉及到
      多部分/表单数据。您可以自己编写代码,但实际上在发送文件时不需要这样做。我会发布一个例子。你能具体说明一下其他问题/网站上的建议中哪些不起作用吗?否则,这里的答案很可能也不适用于您。当然,我看到了一些他们发送xml或文本文件的地方,这些文件被序列化为字符串。或者一些(比如protobuf)将数据结构序列化到文件中。我也看到过一些使用多部分协议的例子,但是compact框架不支持这一点。我知道,大多数例子都涉及到
      多部分/表单数据。您可以自己编写代码,但实际上在发送文件时不需要这样做。我将发布一个示例。我尝试了这个,但遇到了一些问题。首先,CF请求流只允许字符数组。我可以很好地使用requestStream.BaseStream.Write。但是,我不确定这是否导致了错误,因为我一直从我的REST应用程序中获取一个内部服务器错误(“远程服务器返回了一个错误:(500)内部服务器错误”)。我可以使用postman发送测试数据,效果很好,但我的CF应用程序会让服务器返回该错误。这让我觉得CF方面出了问题。没有限制只允许CF上使用字符数组(至少在2.0和3.5上不允许)。我认为问题在于,您的服务希望数据以某种格式发送,如JSON或XML,如果是这种情况,则需要对二进制数据进行编码(即使用Base64)。很好,现在一切正常。我为RequestStream使用了一个StreamWriter对象,它不接受read语句中的字节数组(另外,您不能在CF中使用对象,因为它不支持后期绑定)。我切换到流对象,没问题。至于服务器错误,它是在我的本地机器上工作的,而测试与邮递员。由于部署问题,它无法实时工作。谢谢我试过了,遇到了一些问题。首先,CF请求流只允许字符数组。我可以很好地使用requestStream.BaseStream.Write。但是,我不确定这是否导致了错误,因为我一直从我的REST应用程序中获取一个内部服务器错误(“远程服务器返回了一个错误:(500)内部服务器错误”)。我可以使用postman发送测试数据,效果很好,但我的CF应用程序会让服务器返回该错误。这让我觉得CF方面出了问题。没有限制只允许CF上使用字符数组(至少在2.0和3.5上不允许)。我认为问题在于,您的服务希望数据以某种格式发送,如JSON或XML,如果是这种情况,则需要对二进制数据进行编码(即使用Base64)。很好,现在一切正常。我为RequestStream使用了一个StreamWriter对象,它不接受read语句中的字节数组(另外,您不能在CF中使用对象,因为它不支持后期绑定)。我切换到流对象,没问题。至于服务器错误,它是在我的本地机器上工作的,而测试与邮递员。由于部署问题,它无法实时工作。谢谢