跨平台RESTful WCF方法,传递和返回字节数组
本文关键字:返回 字节 字节数 数组 RESTful WCF 方法 跨平台 | 更新日期: 2023-09-27 17:54:38
理论上这么简单,但我从来都不是WCF配置的奇才。我想做的是:我有一个匹配这个签名的WCF方法:
[OperationContract]
[WebInvoke(Method = "POST")]
Stream PostPackets(Stream rawPackets);
我真正关心的是从Android/iPhone/Blackberry/任何其他类型的设备获取字节数组,到我的wcf服务,处理数组,然后发回不同的字节数组。不管怎样,它可以是这样的:
[OperationContract]
[WebInvoke(Method = "POST")]
byte[] PostPackets(byte[] rawPackets);
虽然我看到的所有例子似乎都使用Stream.
我读过许多不同的文章和帖子,没有直接回答如何在文件传输的上下文中做到这一点(这不是我的意图)。以下是我面临的问题:
1-我假设我需要使用webHttpBinding来使这个服务RESTful。这样对吗?如果有,你能给我一个配置示例吗?
2 -(这绝对是我找不到任何地方!)我需要确保这不会给设备开发者带来巨大的痛苦。你能给我举几个Android和iPhone设备都使用RESTful服务的例子吗?(非常重要)它们是如何向我的服务发送字节数组的?
请原谅我的无礼…WCF配置是我不是每天都要做的事情之一。一旦我弄清楚了我的配置,我通常就会继续前进,直到我的下一个项目(这可能是很长一段时间)才需要碰它。请帮助!
我的同事建议我们使用http处理程序而不是wcf。我们真的要诉诸那个吗?
例如:
public void ProcessPackets (HttpContext context)
更新2:我想知道,有没有办法做到这一点没有JSON?是否有任何缺点/替代张贴数组类型"文本/纯"?
也许这个简单的(和工作的例子)可以帮助
服务器void StartServer()
{
Task.Factory.StartNew(() =>
{
WebServiceHost host = new WebServiceHost(typeof(MyService), new Uri("http://0.0.0.0:80/MyService/"));
host.Open();
});
}
[ServiceContract]
public class MyService
{
[OperationContract]
[WebInvoke(
RequestFormat = WebMessageFormat.Json,
ResponseFormat = WebMessageFormat.Json,
BodyStyle = WebMessageBodyStyle.WrappedRequest)]
public byte[] PostPackets(byte[] rawPackets)
{
rawPackets[0] = 99;
return rawPackets;
}
}
<html>
<script src='jquery-1.8.3.min.js'></script>
<body>
<script>
$(document).ready(function () {
$.ajax({
type: "POST",
contentType: "application/json",
url: "/MyService/PostPackets",
data: JSON.stringify({rawPackets:[65,66,67]}),
dataType: "text",
success: function (data) {
//var div = $("#test").empty();
//$("#test").html(data.d);
alert('success');
},
error: function (XMLHttpRequest, textStatus, errorThrown) {
alert('error');
}
});
});
</script>
</body>
</html>
最后的解决方案如下:(这确实很简单)
服务端:
[ServiceContract]
public interface IMyService
{
[OperationContract]
[WebInvoke(Method = "POST",
BodyStyle = WebMessageBodyStyle.Wrapped,
UriTemplate="TestMethod/")]
Stream TestMethod(Stream input);
}
public class MyService: IMyService
{
Stream IMyService.TestMethod(Stream input)
{
byte[] buffer = new byte[10000];
int bytesRead, totalBytesRead = 0;
this.currentResponseOffset = 0;
do
{
bytesRead = input.Read(buffer, 0, buffer.Length);
totalBytesRead += bytesRead;
} while (bytesRead > 0);
input.Close();
return new MemoryStream(buffer, 0, totalBytesRead);
}
}
配置如下:
<services>
<service name="MyService" >
<host>
<baseAddresses>
<add baseAddress="http://localhost:8732/Design_Time_Addresses/MyService/" />
<add baseAddress="net.tcp://localhost:4504/Design_Time_Addresses/MyService/" />
</baseAddresses>
</host>
<endpoint address="MyTCPService" binding="netTcpBinding" contract="IMyTCPService">
</endpoint>
<endpoint address="MyHTTPService" binding="webHttpBinding" behaviorConfiguration="web" contract="IMyService"></endpoint>
<endpoint address="mex" binding="mexTcpBinding" contract="IMetadataExchange" />
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
<!--<endpoint binding="mexHttpsBinding" bindingConfiguration="" contract="IMetadataExchange" />-->
</service>
</services>
<behaviors>
<endpointBehaviors>
<behavior name="web">
<webHttp />
</behavior>
</endpointBehaviors>
</behaviors>
我能够在。net客户端上测试它,尽管这篇文章的重点是知道如何使它跨平台。我想我们很快就会看到!感谢@I4V的帮助,非常感谢。