跨平台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?是否有任何缺点/替代张贴数组类型"文本/纯"?

跨平台RESTful WCF方法,传递和返回字节数组

也许这个简单的(和工作的例子)可以帮助

服务器

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的帮助,非常感谢。