4

理論的には非常に単純ですが、私は WCF 構成の達人ではありませんでした。私がやろうとしているのはこれです:私はこの署名に一致するWCFメソッドを持っています:

[OperationContract]
[WebInvoke(Method = "POST")]
Stream PostPackets(Stream rawPackets);

私が本当に気にしているのは、Android/iPhone/Blackberry/その他の種類のデバイスからバイト配列を取得し、wcf サービスに渡し、配列を処理してから、別のバイト配列を送り返すことだけです。私が気にするすべてのために、それは次のようになります:

[OperationContract]
[WebInvoke(Method = "POST")]
byte[] PostPackets(byte[] rawPackets);

私が見るすべての例は Stream を使用しているように見えますが。

私は多くの異なる記事や投稿を読みましたが、ファイル転送のコンテキスト外でこれを行う方法について明確な答えはありません (これは私の意図ではありません)。私が直面している問題は次のとおりです。

1-このサービスをRESTfulにするためにwebHttpBindingを使用する必要があると思います。これは正しいですか?もしそうなら、サンプル構成を教えてもらえますか?

2 - (そして、これは絶対に私がどこにも見つけられないものです!) これがデバイス開発者にとって大きな苦痛にならないようにする必要があります。RESTful サービスを使用している Android デバイスと iPhone デバイスの両方の例と、(非常に重要な) それらが私のサービスにバイト配列を送信する方法を教えてください。

私の初心者を許してください... WCF構成は、私が毎日行うことができないものの1つです。構成を理解したら、通常は次に進み、次のプロジェクト (非常に長い時間になる可能性があります) までそれに触れる必要はありません。助けてください!

アップデート

私の同僚は、wcf の代わりに http ハンドラーを使用することを提案しました。私たちは本当にそれに頼る必要がありますか?
例えば:

public void ProcessPackets (HttpContext context) 

更新 2:

JSONなしでこれを行う方法はありますか? 配列を「テキスト/プレーン」タイプとして投稿することの欠点/代替手段はありますか?

4

2 に答える 2

4

たぶん、この単純な(そして実際の例)が役立つかもしれません

サーバ

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>
于 2013-01-21T09:15:30.487 に答える
1

結局、解決策は次のとおりでした。(実際はとてもシンプルでした)

サービス側:

[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 ご協力ありがとうございます。

于 2013-01-29T06:47:21.660 に答える