如何在不指定uri / url / baseaddress的情况下使用WCF?反正有没有让它自动获得这些东西?
我的意思是我希望让它像asp.net网站和webservices一样工作,我们不提及uri和东西,只要我们在IIS中配置它就可以自己处理它。 我需要在WCF上使用类似的解决方案。
请帮忙......
谢谢。
修改: 这是我的服务器端代码。我在这里使用自定义的ServiceHostFactory ......
protected override System.ServiceModel.ServiceHost CreateServiceHost(Type serviceType, Uri[] baseAddresses)
{
BasicHttpBinding basichttpbinding = new BasicHttpBinding(BasicHttpSecurityMode.None);
basichttpbinding.CloseTimeout=TimeSpan.MaxValue;
basichttpbinding.OpenTimeout=TimeSpan.MaxValue;
basichttpbinding.ReceiveTimeout=TimeSpan.MaxValue;
basichttpbinding.SendTimeout=TimeSpan.MaxValue;
// basichttpbinding.TransferMode = TransferMode.Buffered;
ServiceEndpoint servicepoint=new ServiceEndpoint(ContractDescription.GetContract(serviceType));
servicepoint.Binding=basichttpbinding;
ServiceHost servicehost = new ServiceHost(serviceType, baseAddresses);
((ServiceDebugBehavior)servicehost.Description.Behaviors[typeof(ServiceDebugBehavior)]).IncludeExceptionDetailInFaults=true;
servicehost.OpenTimeout = TimeSpan.MaxValue;
servicehost.CloseTimeout = TimeSpan.MaxValue;
servicepoint.Binding.SendTimeout = TimeSpan.MaxValue;
servicepoint.Binding.ReceiveTimeout = TimeSpan.MaxValue;
basichttpbinding.MaxBufferPoolSize = 999999999;
// basichttpbinding.MaxConnections = 999999999;
//basichttpbinding.MaxConnections = 999999999;
basichttpbinding.MaxReceivedMessageSize = 999999999;
XmlDictionaryReaderQuotas quotas = new XmlDictionaryReaderQuotas();
quotas.MaxArrayLength = 999999999;
quotas.MaxBytesPerRead = 999999999;
quotas.MaxDepth = 999999999;
quotas.MaxNameTableCharCount = 999999999;
quotas.MaxStringContentLength = 999999999;
basichttpbinding.ReaderQuotas = quotas;
//foreach (Uri uri in baseAddresses)
//{
servicehost.AddServiceEndpoint(typeof(IService), basichttpbinding, "http://localhost:52855/WCFService1/Service.svc");
// }
return servicehost;
}
答案 0 :(得分:3)
(假设您的目标是IIS ...)
根据Deploying an Internet Information Services-Hosted WCF Service文档:
......服务 在IIS中托管没有能力 控制他们的基地址;该 IIS托管服务的基址 是.svc文件的地址。
您的自定义服务主机逻辑是否可能已停止此行为?
更新: 根据函数docs,你可以将相对地址传递给AddServiceEndpoint调用。尝试空字符串或“/".
答案 1 :(得分:2)
查看WCF Discovery它可以让您动态查找端点。
答案 2 :(得分:2)
我认为您需要对代码执行的操作是:
servicehost.AddServiceEndpoint(typeof(IService), basichttpbinding, "");
完成你想要的。正如@Schneider所指出的,IIS控制着服务地址的分配。端点地址始终相对于IIS分配地址。因此,基于IIS的端点的唯一有效值类似于:
servicehost.AddServiceEndpoint(typeof(IService), basichttpbinding, "MyService");
将MyService附加到服务URL。
答案 3 :(得分:0)
我遇到了类似的问题 - 这就是为我解决的问题:
将其添加到界面顶部:
[ServiceContract(Namespace = "your namespace here")]
在您的app.config中,确保该部分中的服务名称采用Namespace.Class
希望这有帮助。