对于WCF的几个问题

acqy 2008-10-30 10:24:12
我想请问几个WCF的问题:
1、如果Service部分没有暴露metadata endpoints,Client部分是否可以使用WsdlImporter以及ChannelFactory动态调用Service?比如,如果Client使用下面的代码去动态调用一个File Download Service,那么在Service部分是否需要暴露metadata endpoint?

static void Main(string[] args)
{
EndpointAddress mexAddress = new EndpointAddress("http://localhost:8889/FileTransfer/mex");
MetadataExchangeClient mexClient = new MetadataExchangeClient(mexAddress);
MetadataSet metadataSet = mexClient.GetMetadata();
WsdlImporter importer = new WsdlImporter(metadataSet);
ServiceEndpointCollection endpoints = importer.ImportAllEndpoints();
ChannelFactory<IFileDownloader> factory = new ChannelFactory<IFileDownloader>(
endpoints[0].Binding, endpoints[0].Address);
IFileDownloader downloader = factory.CreateChannel();
DownloadRequest request = new DownloadRequest("C:\\VIRTPART.DAT");
DownloadResponse response = downloader.Download(request);
Console.WriteLine(response.FileName);
Console.WriteLine(response.Size);
}


2、如果上面的回答是“必须暴露”,那么,如果我希望我的Service始终能够被动态调用,那暴露这个metadata endpoint是否会有安全威胁?如何解决这个矛盾?

3、Binding的设置问题。
比如,我的服务端是采用代码动态配置Service的,代码如下:

static void Main(string[] args)
{
ContractDescription cd = ContractDescription.GetContract(typeof(IFileDownloader));
BasicHttpBinding basicHttpBinding = new BasicHttpBinding();
basicHttpBinding.MaxReceivedMessageSize = 10067108864;
basicHttpBinding.TransferMode = TransferMode.Streamed;
basicHttpBinding.MessageEncoding = WSMessageEncoding.Mtom;
//WSHttpBinding basicHttpBinding = new WSHttpBinding();
ServiceEndpoint endpoint = new ServiceEndpoint(
cd,
basicHttpBinding,
new EndpointAddress("http://localhost:8889/FileTransfer/"));

ContractDescription mexCd = ContractDescription.GetContract(typeof(IMetadataExchange));
ServiceEndpoint mexEndpoint = new ServiceEndpoint(
mexCd,
MetadataExchangeBindings.CreateMexHttpBinding(),
new EndpointAddress("http://localhost:8889/FileTransfer/mex"));


System.ServiceModel.ServiceHost host = new System.ServiceModel.ServiceHost(typeof(FileTransferImpl));
host.Opened += (a, b) => Console.WriteLine("Service Opened.");

ServiceMetadataBehavior smb = new ServiceMetadataBehavior();
smb.HttpGetEnabled = true;
smb.HttpGetUrl = new Uri("http://localhost:8889/FileTransfer/mex");
host.Description.Behaviors.Add(smb);
host.AddServiceEndpoint(endpoint.Contract.ContractType, endpoint.Binding, endpoint.Address.ToString());
host.AddServiceEndpoint(mexEndpoint.Contract.ContractType, mexEndpoint.Binding, mexEndpoint.Address.ToString());
host.Open();
foreach (ServiceEndpoint ep in host.Description.Endpoints)
{
Console.WriteLine(ep.Address.ToString());
}
Console.ReadLine();
}

而客户端是用的第一个问题中的代码。其实事实上Service部分暴露了一个BasicHttpBinding的endpoint,并且设置了这个binding的MaxReceivedMessageSize以及TransferMode,但是我在Client端调试的时候,发现importer.ImportAllEndpoints调用所获得的binding虽然也是BasicHttpBinding,但是上述属性的设置值都遗失了(变成了默认值),这是什么原因呢?有没有办法解决?

希望高人出手相救!

...全文
83 11 打赏 收藏 举报
写回复
11 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
acqy 2008-11-11
我无语,算了,结贴!
  • 打赏
  • 举报
回复
Longgreenlee 2008-11-03
up
  • 打赏
  • 举报
回复
acqy 2008-11-03
继续顶。。。
  • 打赏
  • 举报
回复
acqy 2008-10-31
太没意思了。在线等就是没人回答啊。。。
嫌分不够么?可以加的
  • 打赏
  • 举报
回复
acqy 2008-10-31
这帖子沉的比石头还快。再顶一次,难道真的没有人回答么?
  • 打赏
  • 举报
回复
acqy 2008-10-30
其实事实上Service部分暴露了一个BasicHttpBinding的endpoint -> 其实事实上Service Host部分暴露了一个BasicHttpBinding的endpoint
  • 打赏
  • 举报
回复
acqy 2008-10-30
[Quote=引用 5 楼 heyu1000 的回复:]
太多了,实在不想看,帮顶,呵呵
[/Quote]

即使是回答其中的某个或者某两个问题也可以啊。
拜托了。。。

  • 打赏
  • 举报
回复
heyu1000 2008-10-30
太多了,实在不想看,帮顶,呵呵
  • 打赏
  • 举报
回复
acqy 2008-10-30
-_-!!!

怎么没人回答啊。。。。。

>_<...

  • 打赏
  • 举报
回复
pvgyetg 2008-10-30
友情UP
  • 打赏
  • 举报
回复
acqy 2008-10-30
没人回答么??
在线等。。。。。
  • 打赏
  • 举报
回复
发帖
C#

10.8w+

社区成员

.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
帖子事件
创建了帖子
2008-10-30 10:24
社区公告

让您成为最强悍的C#开发者