【问题标题】:Passing parameters using request headers when using Stream使用 Stream 时使用请求标头传递参数
【发布时间】:2014-06-27 15:26:08
【问题描述】:

在 WCF 服务中有一种上传图片文件的方法:

UploadImage(Stream imageData);

编辑 - 正如答案所示,下一行是错误的,有可能!

由于正在使用 Stream,因此此方法不允许使用其他参数,但需要。

我知道有一些开源项目可以处理多部分流,我可以在其中传递更多参数,但我认为请求标头可能是一个更简单的解决方案。

所以我想知道在这种情况下使用“请求标头”方法可能有什么缺点?

谢谢!

【问题讨论】:

  • 反对票很好,真的。但如果没有评论,这并不是真正的建设性。
  • 您可以将流和其他参数包装在MessageContract 中,例如:stackoverflow.com/questions/1339857/…

标签: c# wcf


【解决方案1】:

由于正在使用 Stream,因此此方法不允许使用其他参数,但需要。

不是真的。这应该可以。

[OperationContract,WebInvoke(UriTemplate="{name}")]
UploadImage(Stream imageData, string name);

这是一个工作示例

async void TestMethod()
{
    Task.Run(() =>
    {
        var host = new WebServiceHost(typeof(MyContract), new Uri("http://0.0.0.0:8088/Test"));
        host.Open();
    });

    await Task.Delay(2000);

    new Webclient().UploadData("http://localhost:8088/Test/UploadImage/abc.bmp", new byte[] { 65, 66, 67, 68, 69 });
}


[ServiceContract]
class MyContract 
{
    [OperationContract, WebInvoke(UriTemplate = "/UploadImage/{name}")]
    public void UploadImage(Stream s, string name)
    {
        Console.WriteLine(name  +  " -> " + new StreamReader(s).ReadToEnd());
    }
}

【讨论】:

  • 我想我的假设是错误的,尽管它是基于我在 SO 和网络上的其他资源上阅读的很多问题。
  • 如果我错了,请纠正我,但我阅读文档的方式可能非常有效,但传输实际上不会流式传输(我假设是练习的重点):msdn.microsoft.com/en-us/library/ms789010(v=vs.110).aspx
  • @KirillShlenskiy WebServiceHost 可以轻松配置为webHttpBinding.TransferMode = TransferMode.Streamed;。我跳过了所有细节来发布一个小而易读的答案。
  • @LB: "请注意,将第二个参数添加到以下 Echo 或 ProvideInfo 操作会导致服务模型恢复为缓冲策略并使用流的运行时序列化表示。仅操作使用单个输入流参数与端到端请求流兼容。此规则同样适用于消息合约。 msdn.microsoft.com/en-us/library/ms733742(v=vs.110).aspx
  • @KirillShlenskiy 让我们以更具体的方式来看看到底发生了什么。不要引用一些链接,而是使用 Fiddler2 并运行上面的代码。你不会在 http-body 中看到 serialized 内容,只是我使用 webClient 发送的纯二进制数据。
猜你喜欢
  • 2017-11-20
  • 2018-03-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-31
  • 1970-01-01
  • 2016-11-14
相关资源
最近更新 更多