如何:使用 Svcutil.exe 将元数据从已编译的服务代码中导出

Svcutil.exe 可以导出已编译程序集中的服务、协定和数据类型的元数据,如下所示:

  • 若要使用 Svcutil.exe 为一组程序集导出所有已编译服务协定的元数据,请将这些程序集指定为输入参数。 这是默认行为。

  • 若要使用 Svcutil.exe 导出已编译服务的元数据,请将该(这些)服务程序集指定为输入参数。 必须使用 /serviceName 选项来指示要导出的服务的配置名称。 Svcutil.exe 自动为指定的可执行程序集加载配置文件。

  • 若要导出一组程序集内的所有数据协定类型,请使用 /dataContractOnly 选项。

注意

请使用 /reference 选项来指定所有相关程序集的文件路径。

导出已编译服务协定的元数据

  1. 将服务协定实现编译为一个或多个类库。

  2. 在已编译程序集上运行 Svcutil.exe。

    备注

    您可能需要使用 /reference 开关指定任意相关程序集的文件路径。

    svcutil.exe Contracts.dll  
    

导出已编译服务的元数据

  1. 将服务实现编译为可执行程序集。

  2. 为服务可执行程序集创建一个配置文件,并添加服务配置。

    <?xml version="1.0" encoding="utf-8" ?>  
    <configuration>  
      <system.serviceModel>  
        <services>  
          <service name="MyService" >  
            <endpoint address="finder" contract="IPeopleFinder" binding="wsHttpBinding" />  
          </service>  
        </services>  
      </system.serviceModel>  
    </configuration>  
    
  3. 在使用 /serviceName 开关指定服务的配置名称的已编译服务可执行程序集上运行 Svcutil.exe。

    注意

    您可能需要使用 /reference 开关指定任意相关程序集的文件路径。

    svcutil.exe /serviceName:MyService Service.exe /reference:path/Contracts.dll  
    

导出已编译数据协定的元数据

  1. 将数据协定实现编译为一个或多个类库。

  2. 在使用 /dataContract 开关指定应仅生成数据协定元数据的已编译程序集上运行 Svcutil.exe。

    注意

    您可能需要使用 /reference 开关指定任意相关程序集的文件路径。

    svcutil.exe /dataContractOnly Contracts.dll  
    

示例

下面的示例演示如何为单个服务实现和配置生成元数据。

导出服务协定的元数据。

svcutil.exe Contracts.dll  

导出数据协定的元数据。

svcutil.exe /dataContractOnly Contracts.dll  

导出服务实现的元数据。

svcutil.exe /serviceName:MyService Service.exe /reference:<path>/Contracts.dll  

<path> 是 Contracts.dll 的路径。

// The following service contract and data contracts are compiled into
// Contracts.dll.  
[ServiceContract(ConfigurationName="IPeopleFinder")]  
public interface IPersonFinder  
{  
    [OperationContract]  
    Address GetAddress(Person s);  
}  
  
[DataContract]  
public class Person  
{  
    [DataMember]  
    public string firstName;  
    [DataMember]  
    public string lastName;  
    [DataMember]  
    public int age;  
}  
  
[DataContract]  
public class Address  
{  
    [DataMember]  
    public string city;  
    [DataMember]  
    public string state;  
    [DataMember]  
    public string street;  
    [DataMember]  
    public int zipCode;  
    [DataMember]  
    public Person person;  
}  
// The following service implementation is compiled into Service.exe.
// This service uses the contracts specified in Contracts.dll.  
[ServiceBehavior(ConfigurationName = "MyService")]  
public class MyService : IPersonFinder  
{  
    public Address GetAddress(Person person)  
    {  
        Address address = new Address();  
        address.person = person;  
        return address;  
    }  
}  
<!-- The following is the configuration file for Service.exe. -->  
<?xml version="1.0" encoding="utf-8" ?>  
<configuration>  
  <system.serviceModel>  
    <services>  
      <service name="MyService">  
         <endpoint  address="finder"  
                    binding="basicHttpBinding"  
                    contract="IPeopleFinder"/>  
      </service>  
    </services>  
  </system.serviceModel>  
</configuration>  

另请参阅