Compact Framework-通过REST上传文件
我正在寻找通过REST将文件从compact框架传输到服务器的最佳方法。我有一个使用.NETWebAPI创建的web服务。我看了一些关于发送文件的问题和其他网站,但没有一个能满足我的需要 我正在尝试将媒体文件从WM 6和6.5设备发送到我的REST服务。虽然大多数文件小于300k,但也有少数文件可能是2-10兆左右。有人有我可以用来做这件事的片段吗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
谢谢 我认为这是发送文件的最低要求:
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
- 我认为这是发送文件的最低要求:
注意:HTTP需要一种方法来知道何时“完成”发送数据。有三种方法可以实现这一点: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 } }
- 设置示例中使用的
,因为我们在发送任何内容之前就知道文件的大小request.ContentLength
- 设置
,以发送数据块,包括它们各自的大小request.SendChunked
- 您还可以设置
写入内存缓冲区,但我不建议在紧凑型框架上浪费那么多内存李>request.AllowWriteStreamBuffering
多部分/表单数据。您可以自己编写代码,但实际上在发送文件时不需要这样做。我会发布一个例子。你能具体说明一下其他问题/网站上的建议中哪些不起作用吗?否则,这里的答案很可能也不适用于您。当然,我看到了一些他们发送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中使用对象,因为它不支持后期绑定)。我切换到流对象,没问题。至于服务器错误,它是在我的本地机器上工作的,而测试与邮递员。由于部署问题,它无法实时工作。谢谢
- 设置示例中使用的