WCF服务以控制台程序为宿主时Silverlight的跨域访问问题.docx

上传人:b****5 文档编号:3859386 上传时间:2022-11-25 格式:DOCX 页数:10 大小:125.50KB
下载 相关 举报
WCF服务以控制台程序为宿主时Silverlight的跨域访问问题.docx_第1页
第1页 / 共10页
WCF服务以控制台程序为宿主时Silverlight的跨域访问问题.docx_第2页
第2页 / 共10页
WCF服务以控制台程序为宿主时Silverlight的跨域访问问题.docx_第3页
第3页 / 共10页
WCF服务以控制台程序为宿主时Silverlight的跨域访问问题.docx_第4页
第4页 / 共10页
WCF服务以控制台程序为宿主时Silverlight的跨域访问问题.docx_第5页
第5页 / 共10页
点击查看更多>>
下载资源
资源描述

WCF服务以控制台程序为宿主时Silverlight的跨域访问问题.docx

《WCF服务以控制台程序为宿主时Silverlight的跨域访问问题.docx》由会员分享,可在线阅读,更多相关《WCF服务以控制台程序为宿主时Silverlight的跨域访问问题.docx(10页珍藏版)》请在冰豆网上搜索。

WCF服务以控制台程序为宿主时Silverlight的跨域访问问题.docx

WCF服务以控制台程序为宿主时Silverlight的跨域访问问题

WCF服务以控制台程序为宿主时的跨域访问问题

     前几天研究SilverLight时碰到了这个问题,本以为很轻松的试验结果很不顺利,查了很多资料才解决了这个问题,在此把解决问题的方法写出来,也方便其它朋友借鉴。

 

     问题是这样产生了,我在测试SilverLight时为了测试与WCF的通讯,创建了一个控制台的应用程序做为WCF服务的宿主程序。

 

    同时创建了一个SilverLight应用程序和一个承载SilverLight的Web程序.

 

    解决方案如图:

   

 

 

  控制台程序:

 

  1.添加WCF服务

 

    命名为WCFService.cs,并添加服务,代码如下:

 

namespaceWCFBase

{

   //注意:

如果更改此处的类名"WCFService",也必须更新App.config中对"WCFService"的引用。

   publicclassWCFService:

IWCFService

   {

       publicintDoWork(inta,intb)

       {

           returna+b;

       }

       publicintDoWork2(inta,intb)

       {

           returna-b;

       }

   }

}

 

 

系统会自动添加App.config文件和相关配置节信息

 

内容如下:

 

xmlversion="1.0"encoding="utf-8"?

>

   

     

       

           

               

                   

                   

               

           

         

      

       

           

               

                   

                       

                   

               

               

               

                   

                       

//localhost:

9090/WCFService/"/>

                   

               

           

            

     

   

 

 

2.加载WCF服务

 

打开主程序入口Main方法,代码如下

 

namespaceWCFBase

{

   classProgram

   {

       staticvoidMain(string[]args)

       {

           ServiceHosthost=newServiceHost(typeof(WCFService));

           host.Open();

 

           Console.WriteLine("I'amHere.");

           Console.ReadKey();

           host.Close();

       }

   }

}

 

至此运行该控制台程序,WCF服务启可使用。

 

 

但当垮域访问时会运行错误,提示没有仅限操作。

这时需要如下操作

3.使WCF可以垮域访问

 

  A.在控制台程序根目添加clientaccesspolicy.xml文件

  内容如下:

 

  

xmlversion="1.0"encoding="utf-8"?

>

 

   

     

       

     

     

       

     

   

 

 

 

  B.添加接口IDomainService(名称可自定义)

 

 首先要添加System.ServiceModel.Web引用

代码如下:

 

usingSystem;

usingSystem.Collections.Generic;

usingSystem.Linq;

usingSystem.Text;

usingSystem.IO;

usingSystem.Xml;

usingSystem.ServiceModel;

usingSystem.ServiceModel.Channels;

 

namespaceWCFBase

{

   /**/

   ///

   ///跨域访问策略服务接口

   ///注意:

如果你更新了ICrossDomainService接口,需要同时更新App.Config

   ///

   [ServiceContract]

   publicinterfaceIDomainService

   {

       [OperationContract]

       [WebGet(UriTemplate="ClientAccessPolicy.xml")]

       MessageProvidePolicyFile();

   }

}

 

C.实现接口IDomainService

类:

DomainService(可自定义)

代码如下:

    

namespaceWCFBase

{

   publicclassDomainService:

IDomainService

   {

       #regionIDomainService成员

       publicSystem.ServiceModel.Channels.MessageProvidePolicyFile()

       {

            FileStreamfilestream=File.Open(@"ClientAccessPolicy.xml",FileMode.Open);

           //EitherspecifyClientAcessPolicy.xmlfilepathproperly

           //orputthatin/Binfolderoftheconsoleapplication

           XmlReaderreader=XmlReader.Create(filestream);

           System.ServiceModel.Channels.Messageresult=Message.CreateMessage(MessageVersion.None,"",reader);

          returnresult;

       }

       //CrossDomainServiceBehavior

       #endregion

   }

}

 

 

D.修改App.config文件

修改后为

 

xmlversion="1.0"encoding="utf-8"?

>

   

     

       

           

               

                   

                   

               

           

         

           

             

           

         

       

      

      

       

           

               

                   

                       

                   

               

               

               

                   

                       

//localhost:

9090/WCFService/"/>

                   

               

           

           

               

                   binding="webHttpBinding"contract="WCFBase.IDomainService"/>

               

                   

                       

//localhost:

9090/"/>

                   

               

           

       

     

   

 

 

灰色区域为新添加的信息,还没有完成,继续...

 

E.修改控制台打开主程序入口Main方法

 

代码如下:

 

namespaceWCFBase

{

   classProgram

   {

       staticvoidMain(string[]args)

       {

           ServiceHosthost=newServiceHost(typeof(WCFService));

           host.Open();

 

           ServiceHostcrossDomainserviceHost=newServiceHost(typeof(DomainService));

           crossDomainserviceHost.Open();

 

           Console.WriteLine("I'amHere.");

           Console.ReadKey();

           host.Close();

       }

   }

}

 

灰色区域为新添加代码

最终程序结构如下:

到此WCF服务即可实现垮域访问.

 

注意:

需要将clientaccesspolicy.xml文件复制到WCFBase.exe相同目录下。

 

 

4.SilverLight与WCF通讯测试

 运行控制台程序WCFBase.exe

如图:

 

 

 

 在SilverLight程序中添加"服务引用",地址为http:

//localhost:

9090/WCFService/

 

 SilverLight代码如下

 

privatevoidbtnTest_Click(objectsender,RoutedEventArgse)

       {

          ServiceReference1.WCFServiceClientwcf=newSilverlightApp.ServiceReference1.WCFServiceClient();

          wcf.DoWorkCompleted+=newEventHandler(wcf_DoWorkCompleted);

           

           wcf.DoWorkAsync(1,2);

       }

       voidwcf_DoWorkCompleted(objectsender,SilverlightApp.ServiceReference1.DoWorkCompletedEventArgse)

       {

           MessageBox.Show(e.Result.ToString());

       }

 

 

  测试截图:

 

证明SilverLight可以正常调用WCF的DoWork方法,并正确返回结果。

 

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 小学教育 > 数学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1