Silverlight,PostAsync 不返回响应

Posted

技术标签:

【中文标题】Silverlight,PostAsync 不返回响应【英文标题】:Silverlight, PostAsync returns no response 【发布时间】:2014-04-17 13:34:37 【问题描述】:

我一直在尝试使用 POST 将图像上传到我的网站,图像被转换为​​ base64 以进行传输。

不幸的是,我的 Siverlight 应用程序出现错误。我已经成功获取了图片的base64字符串,现在我想上传它,这是我用来执行POST请求的代码:

HttpClient hc = new HttpClient();
HttpResponseMessage response = hc.PostAsync("http://mywebsite.com/service.php", new StringContent("image=" + base64)).Result;
if (response.IsSuccessStatusCode)

    MessageBox.Show("Uploaded.");

第二行运行时什么都没有发生,它只是完全暂停,从不跳转到第三行。

因为它是异步的,我想我应该在前面加上await,将行改为:

var response = await hc.PostAsync("http://mywebsite.com/kurv.php", new StringContent("image=" + base64));

它给了我错误:

无法等待'System.Threading.Tasks.Task System.Net.Http.HttpResponseMessage>'

我还检查了 silverlight,它说 silverlight 无法访问不允许访问的站点,因此我在站点的根目录中添加了两个文件 (http://mywebsite.com/):clientaccesspolicy.xml和crossdomain.xml。

clientaccesspolicy.xml 看起来像这样:

<?xml version="1.0" encoding="utf-8"?>
<access-policy>
    <cross-domain-access>
        <policy>
            <allow-from http-request-headers="*">
                <domain uri="*"/>
            </allow-from>
            <grant-to>
                <resource path="/" include-subpaths="true"/>
            </grant-to>
        </policy>
    </cross-domain-access>
</access-policy>

而我的crossdomain.xml 看起来像这样:

<?xml version="1.0"?>
<!DOCTYPE cross-domain-policy SYSTEM "http://www.macromedia.com/xml/dtds/cross-domain-policy.dtd">
<cross-domain-policy>
  <allow-http-request-headers-from domain="*" headers="*"/>
</cross-domain-policy>

当然这是不安全的,但我现在只是为了测试,让我的 Silverlight 应用程序正常工作。

【问题讨论】:

尝试添加 Microsoft.Bcl.Async 以启用异步。不过不确定它是否适用于 SL。 【参考方案1】:

不要使用 await,使用 .ContinueWith,如下所示。 Silverlight 不能很好地处理阻塞操作。

HttpClient client = new HttpClient();
        client.BaseAddress = new Uri("http://localhost/myproject/");

        // Add an Accept header for JSON format.
        client.DefaultRequestHeaders.Accept.Add(
            new MediaTypeWithQualityHeaderValue("application/json"));

        var t = client.GetAsync("api/values");
        t.ContinueWith(p =>
        
            if (p.Result.IsSuccessStatusCode)
            
                var users = p.Result.Content.ReadAsByteArrayAsync().Result;
                if (users != null)
                

                

            

        );

【讨论】:

以上是关于Silverlight,PostAsync 不返回响应的主要内容,如果未能解决你的问题,请参考以下文章

如何等待PostAsync返回?

HTTP 请求 PostAsync 与 HttpClient 取消请求或资源暂时不可用

C# Graph API TranslateExchangeIds().PostAsync() HTTP 方法不允许

Xamarin Forms HttpClient PostAsync 总是抛出 NSMallocException

Silverlight 4,返回用户类列表

C# Metro HttpClient 未在 PostAsync 上接收 cookie