我正在研究从我的应用程序中创建一个自托管的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);
}
}
感谢您提供的任何帮助
答案 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>
我试过这个并且生成了代理而没有任何问题。请让我知道任何疑虑。