【问题标题】:WCF REST File UploadWCF REST 文件上传
【发布时间】:2011-07-12 17:16:01
【问题描述】:

我正在开发一个 WCF Web 服务,该服务需要能够上传文件等。

目前我添加“平面图”项目的方法如下:

[OperationContract]
[WebInvoke(Method = "GET",
    ResponseFormat = WebMessageFormat.Xml,
    BodyStyle = WebMessageBodyStyle.Wrapped,
    UriTemplate = "Floorplan?token={token}&floorplan={floorplan}")]
string XmlInputFloorplan(string token, string floorplan);

我需要对其进行更改,以便将图像作为此调用的一部分上传,可以在以下方法中使用:

public static Guid AddFile(byte[] stream, string type);

在这种情况下,byte[] 是图像的内容。然后将生成的 guid 传递到数据层,并最终确定添加平面图。

所以我需要弄清楚两件事:

1) 我应该如何更改XmlInputFloorplan 接口方法,以便它也允许图像作为参数?
2) 变更后如何使用服务?

谢谢!

我是这样解决的:

[OperationContract]
[WebInvoke(Method = "POST",
    ResponseFormat = WebMessageFormat.Xml,
    BodyStyle = WebMessageBodyStyle.Wrapped,
    UriTemplate = "Floorplan")]
XmlDocument XmlInputFloorplan(Stream content);

期望输入 XML,如:

<?xml version="1.0" encoding="us-ascii" ?>
<CreateFloorplanRequest>
  <Token></Token>
  <Floorplan></Floorplan>
  <Image></Image>
</CreateFloorplanRequest>

并且图像包含一个 base 64 编码的字符串,代表我通过以下方式转换为 byte[] 的图像文件:

XmlDocument doc = new XmlDocument();
doc.Load(content);
content.Close();

XmlElement body = doc.DocumentElement;
byte[] imageBytes = Convert.FromBase64String(body.ChildNodes[2].InnerText);

为了实现这一点,我必须像这样配置 Web.config:

<service behaviorConfiguration="someBehavior" name="blah.blahblah">
    <endpoint 
        address="DataEntry" 
        behaviorConfiguration="web" 
        binding="webHttpBinding" 
        bindingConfiguration="basicBinding" 
        contract="blah.IDataEntry" />
</service>

<bindings>
  <webHttpBinding>
    <binding name="basicBinding" maxReceivedMessageSize ="50000000"
        maxBufferPoolSize="50000000" >
      <readerQuotas maxDepth="500000000"
        maxArrayLength="500000000" maxBytesPerRead="500000000"
        maxNameTableCharCount="500000000" maxStringContentLength="500000000"/>
      <security mode="None"/>
    </binding>
  </webHttpBinding>
</bindings>

【问题讨论】:

    标签: c# wcf rest file-upload


    【解决方案1】:

    你的 URI 看起来会完全不同 - 像这样(我不得不做出一些猜测)

    [OperationContract]
    [WebInvoke(Method = "POST",
               ResponseFormat = WebMessageFormat.Xml,
               BodyStyle = WebMessageBodyStyle.Wrapped,
               UriTemplate = "Floorplan?type={type}&token={token}&floorplan={floorplan}")]
    Guid XmlInputFloorplan(string type, string token, string floorplan, Stream image);
    

    我冒昧地将字节数组更改为 Stream,如果图像很大,您可以选择流式传输图像(但不需要流式传输)

    要调用它,您可以使用正确的 Uri(包括类型、令牌和平面图)创建 WebRequest 并执行 POST。使内容类型适合图像格式(jpeg、png 等),并获取将图像复制到其中的请求流。然后在 WebRequest 上调用 GetResponse 以发出 HTTP 请求

    【讨论】:

    • 这不起作用。它对我大喊大叫,它不知道如何处理 Stream 参数。
    • 它是说对于一篇文章,它只期望一个参数调用流。我最终删除了所有参数,只在流中发送了一个 xml 文件。我仍然会接受答案,因为它让我走上了正确的道路。
    • 我确实在 .NET 4 下完成了这项工作——您使用的是哪个版本的 .NET?
    • @RichardBlewett 这行不通。我有同样的问题。流参数不允许附加任何其他参数。我们必须找到其他解决方案。
    【解决方案2】:

    您将无法将字节数组作为GET 传递。在请求字符串中传递这么多数据是行不通的。你需要做一个 http POST

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-06-11
      • 1970-01-01
      • 1970-01-01
      • 2012-11-24
      • 1970-01-01
      • 1970-01-01
      • 2012-01-16
      相关资源
      最近更新 更多