控制台wcf无需iis解决穿域文件

                wcf可以使用iis或者application作为宿主,使用iis的情况部署麻烦.需要装iis,还要设置mime,等等.

 

                公司的wcf从开始的iis宿主,变更成现在的application宿主.不过使用silverlight,需要用http协议去取得相应端口的穿域文件.

最开始解决办法是wcf使用application宿主,然后安装iis,建1个同样虚拟目录同样端口的站点,只放穿域文件.

 

                现在,参考了一些帖子,解决仍需要iis的问题.

 

                例子代码如下.

                建立个控制台项目.然后在项目上添加wcf服务.改名成MyService.cs

                然后代码为

                MyService.cs

  1.   public class MyService : IMyService
  2.     {
  3.         public string DoWork()
  4.         {
  5.             return "This is A Sample From cross-domain.by Magic_mm";
  6.         }
  7.     }

  IMyService.cs 为

 

        

  1. [ServiceContract]
  2.     public interface IMyService
  3.     {
  4.         [OperationContract]
  5.         string DoWork();
  6.     }

 

下面再添加个wcf服务

名字就叫CrossDomainService.cs

 

CrossDomainService.cs 为

 

  1. public class CrossDomainService : ICrossDomainService
  2.     {
  3.         
  4.         public System.ServiceModel.Channels.Message ProvidePolicyFile()
  5.         {
  6.             FileStream filestream = File.Open(@"ClientAcessPolicy.xml", FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
  7.             XmlReader reader = XmlReader.Create(filestream);
  8.             
  9.             System.ServiceModel.Channels.Message result = Message.CreateMessage(MessageVersion.None, "", reader);
  10.              
  11.             return result;
  12.             
  13.         }
  14.     }

ICrossDomainService.cs 为

  1. [ServiceContract]
  2.     public interface ICrossDomainService
  3.     {
  4.         [OperationContract]
  5.         [WebGet(UriTemplate = "ClientAccessPolicy.xml")]
  6.         Message ProvidePolicyFile();
  7.     }

 

然后,添加个xml文件吧.

名字就叫ClientAcessPolicy.xml

 

内容是

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <access-policy>
  3.   <cross-domain-access>
  4.     <policy>
  5.       <allow-from http-request-headers="*">
  6.         <domain uri="*"/>
  7.       </allow-from>
  8.       <grant-to>
  9.         <resource path="/" include-subpaths="true"/>
  10.       </grant-to>
  11.     </policy>
  12.   </cross-domain-access>
  13. </access-policy>

 

ps:这里运行会出现url错误,建好后可以手动把它复制1份到debug目录

 

然后在Program.cs写

 

  1. static void Main(string[] args)
  2.         {
  3.             ServiceHost myserviceHost = new ServiceHost(typeof(MyService));
  4.             ServiceHost crossDomainserviceHost = new ServiceHost(typeof(CrossDomainService));
  5.             myserviceHost.Open();
  6.             crossDomainserviceHost.Open();
  7.             Console.WriteLine("服务运行中");
  8.             Console.ReadLine();
  9.         
  10.         }

好了,还有

app.config 文件修改如下

 

 

  1. <?xml version="1.0" encoding="utf-8" ?>
  2. <configuration>
  3.     <system.serviceModel>
  4.       <serviceHostingEnvironment aspNetCompatibilityEnabled="true"/>
  5.       
  6.         <behaviors>
  7.             <serviceBehaviors>
  8.                 <behavior name="wcftest.MyServiceBehavior">
  9.                     <serviceMetadata httpGetEnabled="true" />
  10.                     <serviceDebug includeExceptionDetailInFaults="false" />
  11.                 </behavior>
  12.               
  13.             </serviceBehaviors>
  14.           <endpointBehaviors>
  15.             <behavior name="wcftest.CrossDomainServiceBehavior">
  16.               <webHttp/>
  17.             </behavior>
  18.           </endpointBehaviors>
  19.         </behaviors>
  20.       
  21.         <services>
  22.              
  23.             <service behaviorConfiguration="wcftest.MyServiceBehavior" name="wcftest.MyService">
  24.                 <endpoint address="" binding="basicHttpBinding" contract="wcftest.IMyService">
  25.                      
  26.                 </endpoint>
  27.                 <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
  28.                 <host>
  29.                     <baseAddresses>
  30.                         <add baseAddress="http://localhost:8731/wcftest/MyService/" />
  31.                     </baseAddresses>
  32.                 </host>
  33.             </service>
  34.             <service 
  35.                 name="wcftest.CrossDomainService">
  36.                 <endpoint address="" binding="webHttpBinding" contract="wcftest.ICrossDomainService" behaviorConfiguration="wcftest.CrossDomainServiceBehavior">
  37.                 </endpoint>
  38.                  <host>
  39.                     <baseAddresses>
  40.                         <add baseAddress="http://localhost:8731/" />
  41.                     </baseAddresses>
  42.                 </host>
  43.             </service>
  44.         </services>
  45.     </system.serviceModel>
  46. </configuration>

ps: 我这里的wcftest是我项目名,你需要改成你的.

ok

 

再建个测试的silverlight项目吧.

编译好wcf,找到项目debug目录下的exe,先运行

 

现在可以再添加个silverlight项目,完了就添加wcf引用,我的是http://localhost:8731/wcftest/MyService/

我给起个名字叫ConsoleServiceReference

 

ok,然后我的page.xaml.cs的代码如下

 

  1. public partial class Page : UserControl
  2.     {
  3.         public Page()
  4.         {
  5.             InitializeComponent();
  6.             ConsoleServiceReference.MyServiceClient consoleClient = new crosstest.ConsoleServiceReference.MyServiceClient();
  7.             consoleClient.DoWorkCompleted += new EventHandler<crosstest.ConsoleServiceReference
  8. .DoWorkCompletedEventArgs>(consoleClient_DoWorkCompleted);
  9.             consoleClient.DoWorkAsync();
  10.         }
  11.         void consoleClient_DoWorkCompleted(object sender, crosstest.ConsoleServiceReference
  12. .DoWorkCompletedEventArgs e)
  13.         {
  14.             if (e.Result != null)
  15.             {
  16.                 TextBlock serviceText = new TextBlock();
  17.                 serviceText.Text = e.Result;
  18.                 LayoutRoot.Children.Add(serviceText);
  19.             }
  20.         }
  21.     
  22.     }

 

运行....成功显示This is A Sample From cross-domain.by Magic_mm

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 12
    评论
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值