自托管WCF服务

时间:2013-03-04 01:57:39

标签: c# wcf

我正在研究从我的应用程序中创建一个自托管的WCF服务。我试图关注Microsoft Sites 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);
            }
        }

感谢您提供的任何帮助

3 个答案:

答案 0 :(得分:5)

初看起来很难找出问题的问题,但是当我测试你的代码时,我发现你的代码中缺少了一些东西。您忘了将合同暴露给客户。您的界面缺少[ServiceContract]属性。以下将解决您的问题希望这会有所帮助。

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

答案 1 :(得分:1)

我刚才有同样的问题。事实证明,在编辑app.config之后,设计师停止了自动更新app.config文件。你可以从app.config发布标记吗?

答案 2 :(得分: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> 

我试过这个并且生成了代理而没有任何问题。请让我知道任何疑虑。