在不指定 uri 的情况下使用 WCF

本文关键字:情况下 WCF uri | 更新日期: 2023-09-27 17:56:13

如何在不指定 uri/url/baseaddress 的情况下使用 WCF?有没有办法让它自动获得这些东西?

我的意思是,我希望让它像 asp.net 站点和 Web 服务一样工作,我们不提及 uri 和其他东西,只要我们在 IIS 中正确配置它,它就会自行处理它。我需要在 WCF 上提供类似的解决方案。

请帮忙...

谢谢。

编辑:这是我的服务器端代码。我在这里使用自定义服务主机工厂...

 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;
    }

在不指定 uri 的情况下使用 WCF

(假设你的目标是IIS...)

根据部署 Internet 信息服务承载的 WCF 服务文档:

。服务业 托管在 IIS 中没有能力 控制其基址;这 IIS 承载的服务的基址 是其 .svc 文件的地址。

您的自定义服务主机逻辑是否有可能停止此行为工作?

更新:根据函数文档,您只需将相对地址传递给 AddServiceEndpoint 调用即可。尝试空字符串或"/"。

查看 WCF 发现 它允许您动态查找终结点。

我认为你需要对你的代码做的只是:

servicehost.AddServiceEndpoint(typeof(IService), basichttpbinding, "");

实现你想要的。正如@Schneider指出的,IIS 控制服务地址的分配。终结点地址将始终相对于 IIS 分配地址。因此,基于 IIS 的终结点的唯一有效值如下所示:

servicehost.AddServiceEndpoint(typeof(IService), basichttpbinding, "MyService");

这会将我的服务附加到服务 URL。

我遇到了类似的问题 - 这就是为我修复它的原因:

将其添加到界面顶部:

[ServiceContract(Namespace = "your namespace here")]

在 app.config 中,确保该部分中的服务名称采用 Namespace.Class

希望这有帮助。

相关文章: