关于 c#:WCF REST 文件上传

WCF REST File Upload

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

目前我添加 \\'floorplan\\' 项目的方法如下:

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

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

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

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

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

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

谢谢!

我是这样解决的:

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

期望输入 XML,如:

1
2
3
4
5
6
<?xml version="1.0" encoding="us-ascii" ?>
<CreateFloorplanRequest>
  <Token></Token>
  <Floorplan></Floorplan>
  <Image></Image>
</CreateFloorplanRequest>

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

1
2
3
4
5
6
XmlDocument doc = new XmlDocument();
doc.Load(content);
content.Close();

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<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>

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

1
2
3
4
5
6
[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 请求


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