带有HttpClient POST请求的上传文件返回200,但文件未上传

时间:2019-08-02 15:49:17

标签: c# json http uwp

我想将.json文件作为文件上传到服务器。我正在使用C#构建UWP应用。我使用Windows.Web.Http.HttpClient发出POST请求。发布请求返回200,但文件未上传。 URL链接到公司网络托管平台上的文件夹。如果我检查页面或bluehost cpanel页面,则没有最新的文件上传与应用程序的成功请求相对应。如何将文件上传到服务器?我需要提供登录凭证吗? Microsoft UWP甚至不再支持FTP吗?它真的只希望我使用HttpClient

我尝试了各种方法,但是这种方法(我主要是从Microsoft的示例C ++代码中翻译过来的,用于上传一个简单的文件)是它第一次没有返回405或仅转储url的内容。我尝试使用HttpWebRequest格式和System.Net.Http前缀。

fileOpenPicker.FileTypeFilter.Add(".json");
IStorageFile jsonFile = await fileOpenPicker.PickSingleFileAsync();
IRandomAccessStream stream = await jsonFile.OpenAsync(FileAccessMode.Read);
Windows.Web.Http.HttpStreamContent jsonContent = new HttpStreamContent(stream);

jsonContent.Headers.Append("Content-Type", "application/json");

Windows.Web.Http.Headers.HttpContentDispositionHeaderValue disposition = new Windows.Web.Http.Headers.HttpContentDispositionHeaderValue("form-data");
jsonContent.Headers.ContentDisposition = disposition;

disposition.Name ="fileForUpload";
disposition.FileName = "testSurveyFile.json";

Windows.Web.Http.HttpMultipartFormDataContent postContent = new HttpMultipartFormDataContent();
postContent.Add(jsonContent); // Add the binary data content as a part of the form data content.

Windows.Web.Http.HttpResponseMessage httpResponseMessage;
string httpResponseBody;

try
{

    // Send the POST request.
    Uri requestUri = new Uri(uploadurl);
    Windows.Web.Http.HttpClient httpClient = new Windows.Web.Http.HttpClient();
    httpResponseMessage = await httpClient.PostAsync(requestUri, postContent);
    httpResponseMessage.EnsureSuccessStatusCode();
    Debug.WriteLine(httpResponseMessage);
    httpResponseBody = httpResponseMessage.Content.ReadAsStringAsync().GetResults();
}
catch (Exception ex)
{
    Debug.WriteLine(ex);
}

这是httpResponseMessage返回的内容:

StatusCode: 200, 
ReasonPhrase: '', 
Version: 3, 
Content: Windows.Web.Http.HttpStreamContent, 
Headers:
{
  server: nginx/1.14.1
  cache-control: no-store, no-cache, must-revalidate
  set-cookie: PHPSESSID=4f21dec8695cea2b75d009c47d9b94bb; path=/
  date: Fri, 02 Aug 2019 15:28:34 GMT
  pragma: no-cache
}{
  content-type: text/html; charset=UTF-8
  expires: Thu, 19 Nov 1981 08:52:00 GMT
}

但该位置没有新文件。

为澄清起见,文件托管在bluehost上。如果我不能定期发布到bluehost(例如,我可以使用此站点:http://ptsv2.com/t/gizn2-1564768263/d/373971039#),那我该如何解决?它是一个https://前缀,是否表示我需要ssl的凭据或证书?我在哪里或如何找到?

这是httpResponseBody的输出,testSurveyFile.json文件是旧文件,此上载旨在替换或覆盖。这是正确的索引。我希望这些信息能解决一些问题。

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
<html>
 <head>
  <title>Index of /npjTest/SurveyStuff</title>
 </head>
 <body>
<h1>Index of /npjTest/SurveyStuff</h1>
  <table>
   <tr><th valign="top">&nbsp;</th><th><a href="?C=N;O=D">Name</a></th><th><a href="?C=M;O=A">Last modified</a></th><th><a href="?C=S;O=A">Size</a></th><th><a href="?C=D;O=A">Description</a></th></tr>
   <tr><th colspan="5"><hr></th></tr>
<tr><td valign="top">&nbsp;</td><td><a href="/npjTest/">Parent Directory</a>       </td><td>&nbsp;</td><td align="right">  - </td><td>&nbsp;</td></tr>
<tr><td valign="top">&nbsp;</td><td><a href="TestSurvey0/">TestSurvey0/</a>           </td><td align="right">2019-07-26 11:51  </td><td align="right">  - </td><td>&nbsp;</td></tr>
<tr><td valign="top">&nbsp;</td><td><a href="blankHTMLPage.html">blankHTMLPage.html</a>     </td><td align="right">2019-07-22 10:25  </td><td align="right">4.7K</td><td>&nbsp;</td></tr>
<tr><td valign="top">&nbsp;</td><td><a href="composer.json">composer.json</a>          </td><td align="right">2019-07-15 08:00  </td><td align="right"> 60 </td><td>&nbsp;</td></tr>
<tr><td valign="top">&nbsp;</td><td><a href="composer.lock">composer.lock</a>          </td><td align="right">2019-07-15 08:00  </td><td align="right">2.2K</td><td>&nbsp;</td></tr>
<tr><td valign="top">&nbsp;</td><td><a href="error_log">error_log</a>              </td><td align="right">2019-07-31 09:19  </td><td align="right">9.5K</td><td>&nbsp;</td></tr>
<tr><td valign="top">&nbsp;</td><td><a href="surveyConfig.php">surveyConfig.php</a>       </td><td align="right">2019-07-30 10:12  </td><td align="right">675 </td><td>&nbsp;</td></tr>
<tr><td valign="top">&nbsp;</td><td><a href="surveyFinalPage.php">surveyFinalPage.php</a>    </td><td align="right">2019-07-31 14:35  </td><td align="right"> 12K</td><td>&nbsp;</td></tr>
<tr><td valign="top">&nbsp;</td><td><a href="surveyLogic.php">surveyLogic.php</a>        </td><td align="right">2019-07-31 14:34  </td><td align="right">9.8K</td><td>&nbsp;</td></tr>
<tr><td valign="top">&nbsp;</td><td><a href="testSurveyFile.json">testSurveyFile.json</a>    </td><td align="right">2019-07-31 14:37  </td><td align="right">4.0K</td><td>&nbsp;</td></tr>
<tr><td valign="top">&nbsp;</td><td><a href="testSurveyPage.html">testSurveyPage.html</a>    </td><td align="right">2019-07-22 12:18  </td><td align="right">4.7K</td><td>&nbsp;</td></tr>
<tr><td valign="top">&nbsp;</td><td><a href="vendor/">vendor/</a>                </td><td align="right">2019-07-15 07:59  </td><td align="right">  - </td><td>&nbsp;</td></tr>
<tr><td valign="top">&nbsp;</td><td><a href="vendorZIP2.zip">vendorZIP2.zip</a>         </td><td align="right">2019-07-15 07:58  </td><td align="right">2.6M</td><td>&nbsp;</td></tr>
   <tr><th colspan="5"><hr></th></tr>
</table>
<address>Apache Server at ___________.com Port 443</address>
</body></html>

似乎我应该执行HTTP PUT请求而不是POST。我已经考虑过了,尝试改为运行PutAsync,但是遇到了与重定向相关的错误。具体来说,如果我将AllowAutoRedirect设置为false(以绕过指出“ HTTP重定向请求必须由用户确认”的错误),它将返回301响应代码。我不确定为什么要重定向。当我发送uri时,该uri应该转到索引(/ SurveyStuff)还是我要覆盖的文件(/SurveyStuff/testSurveyFile.json)?

如果我将以/SurveyStuff/testSurveyFile.json结尾的uri用于PUT请求,则会收到405(不允许)响应。我意识到这是我从一开始就应该做的事情,尽管我在来这里之前就尝试过。 Postman和我的应用程序均返回了此响应。出于安全目的,bluehost阻止了该请求吗?我已经尝试过各种FTP和站点凭据,但是它们并没有改变。

2 个答案:

答案 0 :(得分:0)

免责声明:我必须承认我对Windows.Web.Http.HttpClient知之甚少。这是一些潜在的修复程序,如果这些修复程序不起作用,则可以使用其他解决方案。

405问题:

  • 如果您收到405错误,我会仔细检查该网址, 您正在将其发送到并确保它是正确的,并且可以接受POST 请求。
  • 我还将检查您是否需要VPN连接才能使用该连接 网址或不网址(尝试从网络浏览器中找到它)。

凭证问题: 尽管这很奇怪,但是因为通常您会收到401(未经授权)错误代码,所以为了安全起见,您可能希望包括凭据。

对于System.Net.Http.HttpClient凭据:

var httpClientHandler = new HttpClientHandler()
{
    Credentials = new NetworkCredential(username, password, domainName),
};

var httpClient = new HttpClient(httpClientHandler);

解决方案1:System.Net.Http.HttpClient多格式数据(this)。

IInputStream inputStream = await file.OpenAsync(FileAccessMode.Read);

HttpMultipartFormDataContent multipartContent = new HttpMultipartFormDataContent();

multipartContent.Add(new HttpStreamContent(inputStream),"myFile",file.Name);

HttpClient client = new HttpClient();
HttpResponseMessage response = await client.PostAsync(uri,multipartContent);

解决方案2 System.Net.Http.HttpClient多部分数据(this)。

在他将图像上传为字节数组时,您必须进行一些调整,我建议使用更多的Using语句,因为它们会自动处理对象。

如果愿意,可以将文件转换为字节数组:

byte[] bytes = System.IO.File.ReadAllBytes(filename);

解决方案3:如果这些方法不起作用,则可以尝试一些替代方法:

我希望这至少会使您走上正确的路:)。

答案 1 :(得分:0)

我第二次谈到了bluehost支持,这次他们说bluehost不支持来自任何外部来源(包括Postman)的HTTP POST请求。看来我需要找到另一个地方托管此文件。对于这一点的困惑,我深表歉意。我很感谢您的帮助,因为它可以帮助我更好地理解HTTP请求和Web编程。非常感谢你。