WCF如何启用元数据?

时间:2010-01-18 21:20:43

标签: c# wcf metadata

我正在尝试让我的svc文件在IIS下运行。在我的项目中,当我按F5时,我得到了svc工作。所以我知道一切都好,对吧?除了IIS。

我正在使用Windows XP Pro计算机,在IIS中我添加了一个虚拟目录。

这是我的代码: IcarePlanActions(项目:A)

namespace WcfServiceLibrary
{
    [ServiceContract]
    public interface ICarePlanActions
    {
        [OperationContract]
        List<string> GetAllClients();
    }
}

客户:(项目:A)

namespace WcfServiceLibrary
{
    public class Client : ICarePlanActions
    {
        public List<string> GetAllClients()
        {
            List<string> clients = new List<string>();
            clients.Add("Hendrik de Jong");
            clients.Add("Miep de Berg");
            clients.Add("Jaap Jongeneel");
            clients.Add("Joop Prakman");
            clients.Add("Pieter Schaakman");

            return clients;

        }
    }
}

Web.config(项目:B)

  <configuration>
    <system.serviceModel>
      <services>
        <service behaviorConfiguration="CarePlanService.Service1Behavior"
          name="WcfServiceLibrary.Client">
          <endpoint address="" binding="wsHttpBinding" contract="WcfServiceLibrary.ICarePlanActions">
            <identity>
              <dns value="localhost" />
            </identity>
          </endpoint>
          <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
        </service>
      </services>
      <behaviors>
        <serviceBehaviors>
          <behavior name="CarePlanService.Service1Behavior">
            <!-- To avoid disclosing metadata information, set the value below to false and remove the metadata endpoint above before deployment -->
            <serviceMetadata httpGetEnabled="true"/>
            <!-- To receive exception details in faults for debugging purposes, set the value below to true.  Set to false before deployment to avoid disclosing exception information -->
            <serviceDebug includeExceptionDetailInFaults="false"/>
          </behavior>
        </serviceBehaviors>
      </behaviors>
    </system.serviceModel>
  </configuration>

CarePlan.svc

<%@ ServiceHost Language="C#" Debug="true" Service="WcfServiceLibrary.Client" %>

当我使用wfctestclient运行此服务(在IIS上)时,我收到此错误

  

错误:无法从中获取元数据   http://localhost/CarePlanService/CarePlan.svc   如果这是Windows(R)通信   您拥有的基础服务   访问,请检查您有   启用了元数据发布   指定地址。

我做错了什么?

我没有在IIS下使用该服务。首先,我手动创建一个虚拟目录,并指向svc所在的directiry。这没用。我不知道为什么。

然后我转到Visual Studio并更改了服务器设置(右键鼠标在项目,属性,选项卡Web上,单击Use local IIS Web Server并单击Create Virtual Directory。当我这样做时,它在IIS下工作上面的代码。

6 个答案:

答案 0 :(得分:7)

首先,删除客户端中的[DataContract]属性。

然后,重新编译并确保您的虚拟目录的/ bin目录中有WcfServiceLibrary.dll。

您的配置应使用此端点进行metadataexchange:

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

答案 1 :(得分:5)

我没有在IIS下使用该服务。首先,我手动创建一个虚拟目录,并指向svc所在的directiry。这没用。我不知道为什么。

然后我转到Visual Studio并更改了服务器设置(右键鼠标在项目,属性,选项卡Web上,单击使用本地IIS Web服务器并单击创建虚拟目录。当我这样做时,它在IIS下使用代码工作上方。

答案 2 :(得分:2)

您引用数据协定作为服务的实现。那是无效的。

[DataContract]
public class Client : ICarePlanActions
{

<service behaviorConfiguration="CarePlanService.Service1Behavior"
      name="WcfServiceLibrary.Client">

更改此项以引用您的服务的实施!您的服务实施情况如何?

也许你应该从Client类中删除DataContract属性。这也不是你的“客户”,而是服务的实施。

答案 3 :(得分:0)

  1. 运行"\%windir%\Microsoft.NET\Framework\v3.0\Windows Communication Foundation\ServiceModelReg.exe" -i

  2. 删除虚拟目录并重新创建。

答案 4 :(得分:0)

只需检查Service.svc文件

中的服务名称即可
<ServiceHost Language="C#" Debug="true" Service="SvcCalculator.**Calculator**"
           CodeBehind="**Calculator.svc.cs**" %>

希望它能够发挥作用。

答案 5 :(得分:0)

确保您的服务命名空间和服务名称与 App.config 文件相对应。

 <system.serviceModel>
  <services>
   <service name="WcfCustomLibrary.Service1">
    <host>
      <baseAddresses>
        <add baseAddress = "http://localhost:8733/Design_Time_Addresses/WcfServiceLibrary/Service1/" />
      </baseAddresses>
    </host>
   </service>
  </services>
 </system.serviceModel>


namespace WcfCustomLibrary
{
// NOTE: You can use the "Rename" command on the "Refactor" menu to change the class name "Service1" in both code and config file together.
public class Service1 : IService1
{