当Silverlight同时遇上TCP和Http的WCF服务

简介:

如果只是单一的TCP通信

如果你的silverlight应用因为一些特殊原因跟WCF通信时使用的不是Http协议,而是TCP协议,并且是Host到控制台上的。那么假设是下面这个简单的服务 

  

1,WCF中的主机服务代码如下

class Program
    {
        static void Main(string[] args)
        {
            ServiceHost host = new ServiceHost(typeof(HelloService));
            host.Open();
            Console.WriteLine("服t务?已?经-启?动ˉ!?");
        }
    }

    [ServiceContract]
    interface IHelloService
    {
        [OperationContract]
        string SayHello(string name);
    }
    public class HelloService : IHelloService
    {
        public string SayHello(string name)
        {
            return "hello," + name;
        }
    }
2,app.config可以简单配置成这样
<configuration>
  <bindings>
    <netTcpBinding>
        <binding name="netTcpBindConfig">
          <security mode="None"/>
        </binding>
      </netTcpBinding>
  </bindings>
  <services>
    <service name="HelloService">
      <host>
        <baseAddresses>
          <add baseAddress="net.tcp://localhost:4503/HelloService"/>
        </baseAddresses>
      </host>
      <endpoint address="" binding="netTcpBinding" contract="WCF.IHelloService"></endpoint>
      <endpoint address="mex" binding="mexTcpBinding" contract="IMetadataExchange" ></endpoint>
    </service>
  </services>
  <behaviors>
    <serviceBehaviors>
        <behavior name="WCF.HelloServiceBehavior">
          <serviceMetadata/>
          <serviceDebug includeExceptionDetailInFaults="false"/>
        </behavior>
      </serviceBehaviors>
  </behaviors>
</configuration>

3,鉴于silverlight4在访问服务的时候会请求主机的80端口得到一个策略文件,如果你按照这个要求在wwwroot下放置这么个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" />
      </grant-to>
    </policy>
  </cross-domain-access>
</access-policy>

那这个服务就OK了。可以正常提供服务了。

如果需要加载另外的DLL,且这DLL访问http的WCF服务呢?

也许您在VS2010中调试会OK,但是在部署到服务器上后,打开页面会发现一个错误,提示的居然是安全性错误。会是什么原因呢,我百思不得其解,奇怪的地方就在于,为什么在VS2010中调试加载的DLL可以正常访问服务,但是一发布就访问不到了呢。后来,在同事的提醒下,我在wwwroot下的文件clientaccesspolicy.xml中加了一行配置

<resource path="/" include-subpaths="true"/>

全部配置为:

<?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>

再打开页面,通过! 

 补充:由于silverlight在访问WCF服务时,需要在80端口获取一个策略文件,而这个策略文件便是给了silverlight一个访问主机的权限。由于我们的silverlight应用本身是访问TCP协议的WCF的,所以需要在wwwroot下放一个策略文件允许TCP的访问,但是由于silverlight应用中又加载了一个DLL,这个DLL是访问HTTP协议的WCF的,所以在请求TCP授权的同时,需要获得HTTP的授权,而<resource path="/" include-subpaths="true"/> 这个配置节正是满足了访问IIS根目录及子目录的权限,当然,包括WCF服务在内。

 




     本文转自wengyuli 51CTO博客,原文链接:http://blog.51cto.com/wengyuli/586744,如需转载请自行联系原作者

相关文章
|
存储 JSON Go
Golang 语言 gRPC 服务怎么同时支持 gRPC 和 HTTP 客户端调用?
Golang 语言 gRPC 服务怎么同时支持 gRPC 和 HTTP 客户端调用?
240 0
|
4月前
|
网络协议 安全 Go
Go语言进行网络编程可以通过**使用TCP/IP协议栈、并发模型、HTTP协议等**方式
【10月更文挑战第28天】Go语言进行网络编程可以通过**使用TCP/IP协议栈、并发模型、HTTP协议等**方式
104 13
|
8月前
|
Java Spring
spring cloud gateway在使用 zookeeper 注册中心时,配置https 进行服务转发
spring cloud gateway在使用 zookeeper 注册中心时,配置https 进行服务转发
192 3
|
8月前
|
文字识别 前端开发 API
印刷文字识别操作报错合集之通过HTTPS连接到OCR服务的API时报错,该如何处理
在使用印刷文字识别(OCR)服务时,可能会遇到各种错误。例如:1.Java异常、2.配置文件错误、3.服务未开通、4.HTTP错误码、5.权限问题(403 Forbidden)、6.调用拒绝(Refused)、7.智能纠错问题、8.图片质量或格式问题,以下是一些常见错误及其可能的原因和解决方案的合集。
|
10月前
|
域名解析 网络协议 应用服务中间件
阿里云服务器配置免费https服务
阿里云服务器配置免费https服务
|
10月前
|
Windows
node搭建本地https和wss服务
node搭建本地https和wss服务
|
10月前
|
Windows
node搭建本地https和wss服务
node搭建本地https和wss服务
111 0
|
10月前
|
网络协议 JavaScript Unix
TCP实现HTTP服务
TCP实现HTTP服务
86 0
|
10月前
|
网络协议 Linux
百度搜索:蓝易云【【http服务】使用命令来查看和停止端口教程。】
通过按照上述步骤使用命令来查看和停止端口,您可以轻松地管理正在运行的服务。请确保在停止端口上的服务时,选择正确的端口号,并谨慎操作以避免影响其他正常运行的服务。
83 0
|
Go 数据库 微服务
Go语言微服务框架 - 1.搭建gRPC+HTTP的双重网关服务
大家好,我是六月天天。如题所述,从今天开始,我将和大家一起逐步完成一个微服务框架。
232 1