WCF服务以控制台程序为宿主时Silverlight的跨域访问问题.docx
《WCF服务以控制台程序为宿主时Silverlight的跨域访问问题.docx》由会员分享,可在线阅读,更多相关《WCF服务以控制台程序为宿主时Silverlight的跨域访问问题.docx(10页珍藏版)》请在冰豆网上搜索。
![WCF服务以控制台程序为宿主时Silverlight的跨域访问问题.docx](https://file1.bdocx.com/fileroot1/2022-11/25/8881f724-4ffa-45dc-a7c5-51b4132af582/8881f724-4ffa-45dc-a7c5-51b4132af5821.gif)
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方法,并正确返回结果。