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); |
在这种情况下,
所以我需要弄清楚两件事:
1) 我应该如何改变
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 请求
您将无法将字节数组作为