WCF 跨域TCP绑定

来源:互联网 发布:网络舆情日报 编辑:程序博客网 时间:2024/05/30 04:35

Silverlight4在跨域访问TCP时会读取Http 80端口的跨域策略文件,可以放IIS上,也可以在服务控制台托管Http服务

例子是控制台托管TCP服务和Http跨域策略文件服务

 

配置文件:

<?xml version="1.0"?>
<configuration>
    <system.serviceModel>
      <services>
        <service name="ConsoleApplication1.DuxpexService">
          <endpoint address="" binding="netTcpBinding" bindingConfiguration="netTcpBindConfig"
            contract="ConsoleApplication1.IDuxpexService" />
          <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
          <endpoint address="mex" binding="mexTcpBinding" contract="IMetadataExchange" />
          <host>
            <baseAddresses>
              <add baseAddress="http://localhost:8732/DuxpexService/" />
              <add baseAddress="net.tcp://localhost:4505/DuxpexService/" />
            </baseAddresses>
          </host>
        </service>
        <service name="ConsoleApplication1.DomainService">
          <endpoint address="" behaviorConfiguration="DomainServiceBehavior"
            binding="webHttpBinding" bindingConfiguration="" contract="ConsoleApplication1.IDomainService">
            <identity>
              <dns value="localhost" />
            </identity>
          </endpoint>
          <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
          <host>
            <baseAddresses>
              <add baseAddress="http://localhost/" />
            </baseAddresses>
          </host>
        </service>
      </services>
      
      <bindings>
        <netTcpBinding>
          <binding name="netTcpBindConfig">
            <security mode="None"/>
          </binding>
        </netTcpBinding>
      </bindings>
     
      <behaviors>
            <serviceBehaviors>
                <behavior name="">
                    <serviceMetadata httpGetEnabled="true"/>
                    <serviceDebug includeExceptionDetailInFaults="false"/>
                </behavior>
            </serviceBehaviors>
          <endpointBehaviors>
             <behavior name="DomainServiceBehavior">
                 <webHttp/>
            </behavior>

          </endpointBehaviors>
        </behaviors>
    </system.serviceModel>
 
<startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/></startup>
</configuration>

 

TCP跨域策略文件ClientAccessPolicy.xml

<?xml version="1.0" encoding="utf-8"?>
<access-policy>
  <cross-domain-access>
    <policy>
      <allow-from http-request-headers="*">
        <domain uri="*" />
      </allow-from>
      <grant-to>
        <socket-resource port="4502-4534" protocol="tcp"/>
  <resource path="/" include-subpaths="true"/>
      </grant-to>
    </policy>
  </cross-domain-access>
</access-policy>

 

跨域服务:

    [ServiceContract]
    public interface IDomainService
    {
        [OperationContract]
        [WebGet(UriTemplate = "ClientAccessPolicy.xml")]
        Message ProvidePolicyFile();
    }

    public class DomainService : IDomainService
    {
        public System.ServiceModel.Channels.Message ProvidePolicyFile()
        {

            XmlReader reader = XmlReader.Create(@"ClientAccessPolicy.xml");
            System.ServiceModel.Channels.Message result = Message.CreateMessage(MessageVersion.None, "", reader);

            return result;
        }
    }

 

普通双向服务:

    [ServiceBehavior(ConcurrencyMode=ConcurrencyMode.Reentrant)]
    public class DuxpexService : IDuxpexService
    {
        public int GetData()
        {
            IserviceCallBack client = OperationContext.Current.GetCallbackChannel<IserviceCallBack>();
            client.ClientMethod();

            return 10;
        }
    }

    [ServiceContract(CallbackContract = typeof(IserviceCallBack))]
    public interface IDuxpexService
    {
        [OperationContract]
        int GetData();
    }
    public interface IserviceCallBack
    {
        [OperationContract(IsOneWay = true)]
        void ClientMethod();
    }

 

启动方法:

    class Program
    {
        static void Main(string[] args)
        {
            ServiceHost host = new ServiceHost(typeof(DuxpexService));
            ServiceHost domainhost = new ServiceHost(typeof(DomainService));
            domainhost.Open();
            host.Open();
            Console.WriteLine("Service Start...");
            Console.ReadLine();
            domainhost.Close();
            host.Close();
        }
    }


ClientAccessPolicy.xml

 

原创粉丝点击