1

我有一个使用 WCF REST 服务实现的 Azure Webrole。我正在尝试使用 HTTP POST 请求将一个小图像文件(小于 50KB)上传到该服务。

它适用于以下方法:

  1. 使用 .从 Windows 窗体应用程序上传WebRequest
  2. 通过 Fiddler 代理时从 Android 手机上传。

尝试直接 POST 到 Azure Webrole 时,在同一部 Android 手机上使用相同的 Android 代码失败。

在这种情况下,我得到一个超时,SocketException并且 detailMessage="Connection reset by peer"。在 Azure 中查看 VM 实例(使用 RDP)时,我看到此调用的状态为 400。

这是安卓代码:

DefaultHttpClient httpclient = new DefaultHttpClient();  
String requestStr = "http://servername.cloudapp.net/Rest/RestAPI?action_type=upload_file&user_id=5";

HttpPost httpPost = new HttpPost(requestStr);
HttpParams httpParams = new BasicHttpParams();

// Set the default connection timeout  
// in milliseconds which is the timeout for waiting for a connection.
int timeoutConnection = 60000; 
HttpConnectionParams.setConnectionTimeout(httpParams, timeoutConnection);

// Set the default socket timeout (SO_TIMEOUT)  
// in milliseconds which is the timeout for waiting for data. 
int timeoutSocket = 60000;
HttpConnectionParams.setSoTimeout(httpParams, timeoutSocket);

httpPost.setParams(httpParams);
httpPost.addHeader("Content-Type", "application/x-data-png");
httpPost.addHeader("FileName", fileName);

ByteArrayEntity byteArrayEntity = new ByteArrayEntity(bytes);
httpPost.setEntity(byteArrayEntity);

//Execute HTTP Post Request  
HttpResponse response = httpclient.execute(httpPost);
int statusCode = response.getStatusLine().getStatusCode();

HttpEntity entity = response.getEntity();
String responseStr = EntityUtils.toString(entity);

这是我的 WebRole 代码(用于测试此问题):

[OperationContract]
[WebInvoke(UriTemplate = "?action_type=upload_file&user_id={userID}", Method = "POST", BodyStyle = WebMessageBodyStyle.Bare)]
public void UploadFile(string userID, Stream fileContents)
{
    WebOperationContext.Current.OutgoingResponse.StatusCode = System.Net.HttpStatusCode.OK;
}

更多信息:我尝试了相同的方法,但发送了一个像这样的短字节数组,它确实有效:

String someString = "some string";
byte[] byteArray = someString.getBytes();

这让我觉得也许我没有正确读取文件或者字节数组太长(50KB 应该是个问题吗?)

这是我用来获取文件字节的 Android 代码:

FileInputStream fileStream = new FileInputStream(fileToUpload);
fileStream.read(bytes);
fileStream.close();

我究竟做错了什么?

更新:我在直接发布到服务器的 Android 模拟器中尝试了完全相同的代码,它工作了......为什么这不能通过手机工作?!

更新:原来我的路由器上的 WiFi 有一个奇怪的问题(!)

其他一切工作正常,仅从 Android 手机上传到一定大小以上的 Azure 失败……(从同一部手机上传的其他内容确实有效……)我将路由器换成了新路由器,一切都恢复正常了。

另外:我要表扬一下整整一周没有抛弃我并帮助我最终理解问题的 Azure 支持人员。

我想我应该把这当成一场怪异的事故,然后继续我的生活:-)

这也意味着上面的代码是如何做事的一个很好的例子。希望它会帮助某人...

4

0 回答 0