0

Windows サービスでホストされている WCF サービスがあります

NetTCPBinding を使用しており、接続できました。新しい Silverlight クライアントを実装してサービスにアクセスしたい

サービス参照を追加する通常の方法を説明しましたが、空の「ServiceReferences.ClientConfig」で追加されました

だから私はいくつかのスレッドとトピックを見てきました。最後に、サービスの構成を手動で書きました

接続しようとすると、この例外が表示されます。 net.tcp://localhost:4502/MyService/Service に接続できませんでした。接続の試行は、00:00:02.2111265 の期間継続しました。TCP エラー コード 10013: アクセス許可によって禁止されている方法でソケットにアクセスしようとしました.これは、サービスがクロスドメイン アクセス用に構成されていないときに、クロスドメインの方法でサービスにアクセスしようとしたことが原因である可能性があります. サービスの所有者に連絡して、HTTP 経由でソケット クロスドメイン ポリシーを公開し、許可されたソケット ポート範囲 4502 ~ 4534 でサービスをホストする必要がある場合があります。

問題は ClientAccessPolicy.xml ファイルに関連していると思います

IIS7をインストールする必要があり、それを介してファイルにアクセスできると検索人が言った後、これを試しましたが、機能しませんでした

しかし、私は以前にこれに取り組んでいましたが、私はPollinghttpBindingをNetTCPなしで使用していました.ClientAccessPolicyファイルを返すために別のサービスコントラクトを作成しました.

私は PollinghttpBinding で以前と同じことをしようとしましたが、サービスの正しい構成を書くことができません

私のクライアントは IIS の使用を拒否しています。この方法で使用できますか?また、このサービスで使用する適切な構成は何ですか?

これは、サービスに使用する構成です

<service behaviorConfiguration="serviceBehavior" name="MyService">
              <endpoint address="net.tcp://localhost:4502/MyService/Service"       behaviorConfiguration="endpointBehavior" binding="netTcpBinding"         bindingConfiguration="netTcpServiceBinding" contract="IMyService">
                  <identity>
                      <dns value="localhost"/>
                  </identity>
              </endpoint>
              <endpoint address="net.tcp://localhost:7000/MyService/mex"     binding="mexTcpBinding" contract="IMetadataExchange"/>
          </service>

誰でも助けてくれる?

4

1 に答える 1

0

Net.tcp バインディングは、Silverlight では「そのまま」サポートされていません。そのため、構成は空です。ただし、customBinding を使用して必要なプロパティを設定することで、とにかく使用できます。しかし、私はこれを自分で試したことはありません。

これがクロス ドメインの問題である場合は、ClientAccessPolicy.xml ファイルに関連する必要があります。通常(さまざまなフォーラムの多くの場所で述べられているように)、これはファイルをサイトのルートに置くことで解決されます。そのため、サービスが「http://localhost/MyService」で実行されている場合、「http://lovalhost」で利用できるようにファイルを配置する必要があります。

ただし、IIS が利用できない場合、これは別の方法で行う必要があります。このファイルが利用可能な Windows サービスで、ルートに手動でエンドポイントを作成する必要があります。これは、「net.tcp」または「http」を使用する通常の BasicHttp バインディングです。

私はこの方法でこれを成功させました:

ポリシー インターフェース:

using System;
using System.IO;
using System.ServiceModel;
using System.ServiceModel.Web;

namespace MyPolicyService
{
    [ServiceContract]
    public interface IPolicyRetriever
    {
        [OperationContract]
        Stream GetPolicy();
    }
}

ポリシー クラス:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.ServiceModel.Web;

namespace MyPolicyService
{
    public class PolicyRetrieverBase : IPolicyRetriever
    {
        public Stream StringToStream(String result)
        {
            WebOperationContext.Current.OutgoingResponse.ContentType = "application/xml";
            return new MemoryStream(Encoding.UTF8.GetBytes(result));
        }

        public Stream GetSilverlightPolicy()
        {
            string result = @"<?xml version=""1.0"" encoding=""utf-8""?>
<access-policy>
    <cross-domain-access>
        <policy>
            <allow-from http-request-headers=""*"" http-methods=""*"">
                <domain uri=""*""/>
            </allow-from>
            <grant-to>
                <resource path=""/"" include-subpaths=""true""/>
            </grant-to>
        </policy>
    </cross-domain-access>
</access-policy>";

            return StringToStream(result);
        }

        public Stream GetFlashPolicy()
        {
            string result = @"<?xml version=""1.0"" encoding=""utf-8""?>
<!DOCTYPE cross-domain-policy SYSTEM ""http://www.macromedia.com/xml/dtds/cross-domain-policy.dtd"">
<cross-domain-policy>
    <site-control permitted-cross-domain-policies=""all""/>
    <allow-access-from domain=""*"" secure=""false"" />
    <allow-http-request-headers-from domain=""*"" headers=""*"" secure=""false"" />
</cross-domain-policy>";

            return StringToStream(result);
        }
    }
}

これらのクラスが作成されたら、「net.tcp」サービスを開始するのとほぼ同じようにサービスを作成しますが、もちろんそれを BasicHttpBinding に変更し、BasicHttpBinding に関連するいくつかの異なる動作とプロパティ値 (TransferMode = Buffered など) を使用します。

このポリシー サービスは、言うまでもなく、サイト ルート (http://localhost) で開始する必要があります。ID このサーバーで IIS を実行しています。このアドレスを引き継ぐため、このポリシー サービスを開始しないでください :-)

それがあなたを正しい方向に動かしてくれることを願っています:-)

于 2012-12-30T19:59:49.500 に答える