我刚学习wcf,目前已经走到了这一步。
CS文件:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.Text;
namespace wcfLib
{
[ServiceContract]
public interface IfaceService
{
[OperationContract]
int wordLen(string word);
}
public class StockService : IfaceService
{
public int wordLen(string word)
{
return word.Length;
}
}
}
然而,当我试图运行它时,它会弹出一个错误:
WCF服务主机找不到任何服务元数据......
知道它可能是什么吗?
配置文件:
<system.serviceModel>
<services>
<service behaviorConfiguration="wcfLib.Service1Behavior" name="wcfLib.Service1">
<endpoint address="" binding="wsHttpBinding" contract="wcfLib.ser">
<identity>
<dns value="localhost" />
</identity>
</endpoint>
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
<host>
<baseAddresses>
<add baseAddress="http://localhost:8732/Design_Time_Addresses/wcfLib/Service1/" />
</baseAddresses>
</host>
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior name="wcfLib.Service1Behavior">
<serviceMetadata httpGetEnabled="True"/>
<serviceDebug includeExceptionDetailInFaults="False" />
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>
答案 0 :(得分:25)
您需要在配置文件中包含以下内容:
1)元数据的服务行为:
<behaviors>
<serviceBehaviors>
<behavior name="Metadata">
<serviceMetadata httpGetEnabled="true" />
</behavior>
</serviceBehaviors>
</behaviors>
2)在服务的配置中引用服务行为
<service name="wcfLib.StockService"
behaviorConfiguration="Metadata">
....
</service>
*配置文件中服务标签中的名称值必须与实现合同的物理类名称相同。请记住,如果班级名称发生变化,请务必更改此值以匹配。
3)MEX的端点(元数据交换)
<service name="wcfLib.StockService"
behaviorConfiguration="Metadata">
....
<endpoint name="mex"
address="mex"
binding="mexHttpBinding"
contract="IMetadataExchange" />
</service>
有了这一切,事情应该没问题! : - )
答案 1 :(得分:15)
我遇到了同样的问题,并且正在大力浏览我的配置,所有内容与元数据端点等内联。问题是什么?这一行:
<service behaviorConfiguration="wcfLib.Service1Behavior" name="wcfLib.Service1">
name
值必须,必须具有实施合同的物理类的名称。我忘记了...再一次,任意地命名它认为它可能是任何字符串。因此,在上面的情况下,实现类必须命名为Service1
。如果班级名称发生变化,请务必更改此值。
这就像WCF 101的东西,即使我自从在Framework 3.0中使用CTP以来一直在做WCF,我仍然会被它烧掉。等等...
答案 2 :(得分:1)
创建此问题的最简单方法是简单地重新计算您的接口名称。它肯定会更改项目中的实例名称,但无法更新web.config文件。要重新创建一个新服务,重命名你的界面并敲击F5,繁荣,元数据对话框出现:-)答案如上,只记得手动改变你的web.config文件。
此致
答案 3 :(得分:1)
我已启用HTTP激活。确保你已经拥有它。
答案 4 :(得分:0)
听起来您需要添加元数据交换端点:
http://en.csharp-online.net/WCF_Essentials%E2%80%94Metadata_Exchange
答案 5 :(得分:0)
默认情况下,Visual Studio将尝试设置客户端/测试ui,以便您使用新服务进行操作。要做到这一点,需要了解您的服务提供的结构和方法。这是通过使用标准WSDL格式的定义来实现的。但是,默认情况下,WCF不会发布此数据。
您必须将metadataexchange端点行为设置为acehive。
在此处发布您的配置文件,我们可以协助,或google / stack搜索WCF中的metadataexchange和wsdl
答案 6 :(得分:0)
我收到此错误是因为我的服务名称错误。使用netTcpBinding和mexTcpBinding与httpGetEnabled = False然后工作。
答案 7 :(得分:0)
// get the <system.serviceModel> / <services> config section
ServicesSection services = ConfigurationManager.GetSection("system.serviceModel/services") as ServicesSection;
ServiceHost host = new ServiceHost(typeof(SelfHostedService.Service));
// enumerate over each <service> node
foreach (ServiceElement aService in services.Services)
{
Console.WriteLine();
Console.WriteLine("Name: {0} / Behavior: {1}", aService.Name, aService.BehaviorConfiguration);
// enumerate over all endpoints for that service
foreach (ServiceEndpointElement see in aService.Endpoints)
{
Console.WriteLine("\tEndpoint: Address = {0} / Binding = {1} / Contract = {2}", see.Address, see.Binding, see.Contract);
//host.AddServiceEndpoint(
}
}
try
{
Console.WriteLine("Service EndPoints are: ");
foreach (ServiceEndpoint endpoint in host.Description.Endpoints)
{
Console.WriteLine("{0} ({1})", endpoint.Address.ToString(), endpoint.Binding.Name);
}
host.Open();
Console.WriteLine(string.Concat("Service is host at ", DateTime.Now.ToString()));
Console.WriteLine("\n Self Host is running... Press <Enter> key to stop");
}
catch(Exception ex)
{
Console.WriteLine(ex.Message.ToString());
}
如果仍然无效,请删除当前配置文件并使用其默认名称App.config重新创建它,这是有效的。
答案 8 :(得分:0)
如果以编程方式创建服务主机并忘记将[ServiceContract]和[OperationContract]属性添加到接口协定中,也会出现同样的错误。
答案 9 :(得分:0)
我知道这是一个古老的问题,但我想我已经在这个问题上给出了2美分,因为它刚好发生在我身上。
我以某种方式改变了我的构建平台#34;任何CPU&#34;到&#34; x86&#34;对于Web服务本身。第二个我把它改回&#34;任何CPU&#34;,它解决了问题。