使用WCF而不指定uri

时间:2011-05-13 06:33:55

标签: c# wcf

如何在不指定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;
    }

4 个答案:

答案 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

格式

希望这有帮助。