WCF客户端无法查看端点,但WCF客户端可以连接到基址

时间:2011-09-28 05:42:57

标签: wcf

当我尝试使用我的wcf服务时出现以下错误

找不到名称为“http:// localhost:8080 / Provider / basic”的端点元素,并且在ServiceModel客户端配置部分中找不到“Provider.IProvider”

然而,我可以通过http://localhost:8080/Provider

上的WCF测试客户端连接到我的基地址

我已尝试更新我的服务参考但是没有用,任何人都知道我的设置有什么问题

    public ServiceHost ProviderServiceHost { get; set; }

    private void StartProvider()
    {
        if (ProviderServiceHost != null)
            Abort();
        ProviderServiceHost = new ServiceHost(typeof(Provider), new Uri("http://localhost:8080/Provider"));
        var binding = new BasicHttpBinding
        {
            Name = "basicBinding",
            HostNameComparisonMode = HostNameComparisonMode.WeakWildcard,
            Security = { Mode = BasicHttpSecurityMode.None }
        };

        var metadataBehavior = ProviderServiceHost.Description.Behaviors.Find<ServiceMetadataBehavior>();
        if (metadataBehavior == null)
        {
            metadataBehavior = new ServiceMetadataBehavior { HttpGetEnabled = true };
            ProviderServiceHost.Description.Behaviors.Add(metadataBehavior);
        }

        ProviderServiceHost.AddServiceEndpoint(typeof(IProvider), binding, "http://localhost:8080/Provider/basic");

        ProviderServiceHost.Open();
    }

我的客户端正在连接

  private static ProviderClient _proxy = new ProviderClient(http://localhost:8080/Provider/basic);

如果我没有输入地址,那么我会得到这个例外

消息“无法在ServiceModel客户端配置部分找到引用合同'Provider.IProvider'的默认端点元素。这可能是因为找不到您的应用程序的配置文件,或者因为找不到与此合同匹配的端点元素在客户端元素中。“串

1 个答案:

答案 0 :(得分:1)

您使用的是客户端配置吗?因为看起来你正在使用ClientBase代理,我希望你使用'添加服务引用...',它只是默认的配置文件。

您正在使用的重载是new ServiceClient(string endpointConfigurationName) - 字符串值表示名称,而不是地址。如果您检查配置文件,则应该看到已添加client部分:

<client>
    <endpoint address="http://localhost:8080/Provider/basic" 
              binding="basicHttpBinding"
              bindingConfiguration="basicBinding_IProvider" 
              contract="ServiceReference1.ITest"
              name="basicBinding_IProvider" />
</client>

因此,如果您将Client构造函数更改为使用此Name属性,那么它应该更适合您。

private static ProviderClient _proxy = 
    new ProviderClient("basicBinding_IProvider");

另一方面,如果您使用配置文件并想在代码中指定地址,则可以使用不同的ClientBase构造函数:

using System.ServiceModel;
// ...

_client = new ProviderClient(new BasicHttpBinding(), 
            new EndpointAddress("http://localhost:8080/Provider/basic"));

ClientBase类(您的ProviderClient)中有许多不同的重载,允许您指定各种属性。