2

我正在研究从我的应用程序中创建一个自托管的 WCF 服务。我正在尝试按照 Microsoft 站点http://msdn.microsoft.com/en-us/library/ms731758(v=vs.100).aspx上的示例进行操作,但我遇到了问题。

当程序运行时,我可以进入网页,上面说我可以运行 svcutil.exe 来生成客户端类,或者当我进入教程说我收到错误的 WCF 测试客户端时

Service metadata may not be accessible. Make sure your service is running and exposing metadata.

从 svcutil.exe 我收到以下错误:

C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC>svcutil http://localhost:
6525/hello
Microsoft (R) Service Model Metadata Tool
[Microsoft (R) Windows (R) Communication Foundation, Version 4.0.30319.1]
Copyright (c) Microsoft Corporation.  All rights reserved.

Attempting to download metadata from 'http://localhost:6525/hello' using WS-Meta
data Exchange or DISCO.
Generating files...
Warning: No code was generated.
If you were trying to generate a client, this could be because the metadata docu
ments did not contain any valid contracts or services
or because all contracts/services were discovered to exist in /reference assembl
ies. Verify that you passed all the metadata documents to the tool.

Warning: If you would like to generate data contracts from schemas make sure to
use the /dataContractOnly option.

下面是我的 WCF 应用程序的代码

public interface IHelloWorldService
        {
            [OperationContract]
            string SayHello(string firstName, string lastName);
        }

        static void Main(string[] args)
        {
            Uri baseAddress = new Uri("http://localhost:6525/hello");

            using (ServiceHost host = new ServiceHost(typeof(HelloWorldService), baseAddress))
            {
                ServiceMetadataBehavior smb = new ServiceMetadataBehavior();
                smb.HttpGetEnabled = true;
                smb.MetadataExporter.PolicyVersion = PolicyVersion.Policy15;
                host.Description.Behaviors.Add(smb);

                host.Open();

                Console.WriteLine("The service is ready at: {0}", baseAddress);
                Console.WriteLine("Press <Enter> to stop the service");
                Console.ReadLine();
                host.Close();

            }
        }

        public class HelloWorldService : IHelloWorldService
        {
            public string SayHello(string firstName, string lastName)
            {
                return string.Format("Hello {0} {1}", firstName, lastName);
            }
        }

感谢您的任何帮助,您可以提供

4

3 回答 3

5

乍一看很难找出你的问题的问题,但当我测试你的代码时,我发现你的代码中缺少一些东西。您忘记向客户公开您的合同。您的界面缺少 [ServiceContract] 属性。下面将解决您的问题,希望对您有所帮助。

[ServiceContract]
public interface IHelloWorldService
{
    [OperationContract]
    string SayHello(string firstName, string lastName);
}
于 2013-03-04T03:35:59.467 回答
1

我刚刚遇到了完全相同的问题。原来,编辑后app.config,设计师停止了自动更新app.config文件。您可以从 发布标记app.config吗?

于 2013-03-04T02:07:03.950 回答
1

元数据未在此处公开,您需要为此添加新的 EndPoint 并需要在服务配置中启用它。请执行以下操作。

<service name="ConsoleApplication1.WCFService1" behaviorConfiguration="newBehaviour" >
        <endpoint address="mex"  binding="mexHttpBinding"
                  contract="IMetadataExchange" />

        <host>
            <baseAddresses>
                <add baseAddress="http://localhost:80/WCFService1" />
            </baseAddresses>
        </host>
<service>

并在服务行为中

<serviceBehaviors>
          <behavior name="newBehaviour">
            <serviceMetadata httpGetEnabled="true"/>
          </behavior>
</serviceBehaviors> 

我已经尝试过了,并且生成了代理没有任何问题。请让我知道任何疑虑。

于 2013-03-04T10:07:34.997 回答