9

我是 WCF 的初学者,我正在学习 Essential WCF。

我在使用 ServiceContract NameSpace 和 Name 时遇到了问题。当我运行代码时,我捕捉到了下面的 InvalidOperationException。但我无法理解清楚。

绑定实例已关联到侦听 URI 'http://localhost:8080/NamespaceChange01'。如果两个端点想要共享同一个 ListenUri,它们也必须共享同一个绑定对象实例。两个冲突的端点要么在 AddServiceEndpoint() 调用中指定,要么在配置文件中指定,要么在 AddServiceEndpoint() 和 config 的组合中指定。

有谁知道如何避免 InvalidOperationException ?

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ServiceModel;

namespace NamespaceChange01
{

    [ServiceContract(Name = "MyServiceName", Namespace = "http://ServiceNamespace")]
    public interface IBurgerMaster
    {
        [return: MessageParameter(Name = "myOutput")]
        [OperationContract(Name = "OperationName", Action = "OperationAction", ReplyAction = "ReplyActionName")]
        double GetStockPrice(string ticker);
    }

    [ServiceBehavior(Namespace = "http://MyService")]
    public class BurgerMaster : IBurgerMaster
    {

        public double GetStockPrice(string ticker)
        {
            return 100.99;
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            ServiceHost host = new ServiceHost(typeof(BurgerMaster));
            host.Open();
            Console.ReadLine();
            host.Close();
        }
    }
}
  • 应用程序配置

    <?xml version="1.0" encoding="utf-8" ?>
    <configuration>
      <system.serviceModel>
        <services>
          <service name="NamespaceChange01.BurgerMaster" behaviorConfiguration="mexServiceBehavior">
            <host>
              <baseAddresses>
                <add baseAddress="http://localhost:8080/NamespaceChange01"/>
              </baseAddresses>
            </host>
            <endpoint name="basic" binding="basicHttpBinding" contract="NamespaceChange01.IBurgerMaster"/>
            <endpoint name="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
          </service>
        </services>
        <behaviors>
          <serviceBehaviors>
            <behavior name="mexServiceBehavior">
              <serviceMetadata httpGetEnabled="true"/>
            </behavior>
          </serviceBehaviors>
        </behaviors>
      </system.serviceModel>
    </configuration>
    

谢谢。

4

4 回答 4

23

两个端点(basic 和 mex)不能在同一个地址上。为其中一个(或两个)添加一些特定地址。

例如:

<endpoint name="mex" address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
于 2012-07-16T15:16:51.280 回答
5

您缺少元数据端点中的地址属性:

<endpoint name="mex" binding="mexHttpBinding" contract="IMetadataExchange" address="mex" />

没有它,WCF 认为您希望将 mex 端点托管在同一地址。

于 2012-07-16T15:16:08.217 回答
0

我知道这是一个老问题,但我最近遇到了一个非常相似的问题,谷歌把我带到了这里,而且我有一个不同的潜在解决方案:

由于相关服务的标记完全缺失service,并且在 IIS 中为其设置了 HTTP 和 HTTPS 绑定,我遇到了所描述的完全相同的错误消息。

自然,添加service标签解决了这个问题。有趣的是,删除 IIS 中的 HTTPS 绑定使 HTTP 版本可用(尽管这显然是不可取的)。

于 2019-07-24T11:48:57.220 回答
-2

在创建您的服务类时,您为什么像代码中所说的那样使用 ServiceContract 属性对其进行标记?

[ServiceBehavior(Namespace = "http://MyService")]
public class BurgerMaster : IBurgerMaster

请删除那个并重试。

于 2012-07-16T14:48:43.900 回答