【问题标题】:Migrating a C# library to Windows Phone将 C# 库迁移到 Windows Phone
【发布时间】:2013-12-03 14:44:32
【问题描述】:

我正在尝试将 Windows C# 库迁移到 Windows Phone 8,我不得不对库从在线 URI 获取数据的方式进行一些更改。

我正在使用 BCL 的 HttpClient 执行我的数据检索,现在一切正常。

该库还需要上传功能,我找不到使用HttpClient 的方法。

代码如下:

// Client setup
var httpclient = new HttpClient();
var request = new HttpRequestMessage(HttpMethod.Post, string.Format(SubmitURI, value));
// Add the headers    
request.Headers.Add("header", header);
var postData = GetPostData();
var data = Encoding.UTF8.GetBytes(postData);
// Side question -> Content is null here!
request.Content.Headers.Add("ContentType", "multipart/form-data; boundary=" + Boundary);
// BEGIN ORIGINAL CODE
var stream = request.GetRequestStream();
stream.Write(data, 0, data.Length);
stream.Close();
// END ORIGINAL CODE
// Get response
var response = await httpclient.SendAsync(request);
var responseContent = new StreamReader(await response.Content.ReadAsStreamAsync()).ReadToEnd();

BEGIN ORIGINAL CODEEND ORIGINAL CODE cmets 之间有我无法迁移的代码,以便您了解它的作用和我可能需要让它在 WP 上工作。

其他的代码已经在WP上工作了,除了

request.Content.Headers.Add("ContentType", "multipart/form-data; boundary=" + Boundary);

因为,由于某些原因,request.Contentnull

所以我的问题是:如何使用HttpClient(或任何更好的方法)将这 3 行迁移到 WP?

还有一个小问题,为什么request.Content 为空?

编辑:根据@Johan van der Slikke 的回答,我编辑了我的代码。编译成功了,但是服务器报告没有上传文件,所以我猜还是有一些问题。

var stream = new MemoryStream(data);
var streamContent = new StreamContent(stream);
request.Content = streamContent;
request.Content.Headers.Add("ContentType", "multipart/form-data; boundary=" + Boundary);
// Get response
var response = await httpclient.SendAsync(request);

【问题讨论】:

    标签: c# file-upload windows-phone-8 httprequest dotnet-httpclient


    【解决方案1】:

    您应该将流包装在StreamContent 类(HttpContent 的子类)中,并使用PostAsyncPutAsync 方法将其与HttpClient 一起发送。

    编辑

    您不需要使用HttpRequestMessage

    var stream = new MemoryStream(data);
    var streamContent = new StreamContent(stream);
    // Get response
    var response = await httpclient.PostAsync(streamContent)
    

    您也不需要使用您的字节数组创建MemoryStream。您可以直接将其包装在ByteArrayContent 中。

    var response = await httpclient.PostAsync(new ByteArrayContent(data))
    

    也许(因为我看到您使用 multipart/form-data 标头)您应该使用 MultipartFormDataContent 类或 FormUrlEncodedContentClasses

    【讨论】:

    • 所以没有必要使用request.GetRequestStream(),但我只需要创建一个新的Stream并将其包装成一个StreamContent,对吗?
    • 确实如此。但是,如果您的 GetPostData() 返回一个字符串,您也可以使用 StringContent 对象,无需创建 Stream
    • 我已经更新了问题,因为我已经尝试过你所说的但服务器说没有上传文件
    【解决方案2】:

    你可以像这样发送多部分内容,

    var client = new HttpClient();
    
    var content = new MultipartContent();
    content.Add(new ByteArrayContent(data));
    
    var response = await client.PostAsync(SubmitUrl, content);
    

    但是,我很好奇您的“PostData”是什么媒体类型。您可能希望在 ByteArrayContent 上设置内容类型标头。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多