从类库转换为WCF需要采取哪些步骤?

时间:2009-11-18 21:46:59

标签: c# wcf hosting app-config

我创建了一个项目作为类库。现在我需要将它变成一个WCF。我可以创建一个WCF项目,但我想避免与TFS一起大惊小怪。我已经完成了App.config并将/client:"wcfTestClient.exe“行添加到了命令行参数中。但是,它似乎还有其他东西在推出主机时缺失。

3 个答案:

答案 0 :(得分:12)

我发现以下内容与您要实现的目标相反,即将服务库更改为控制台应用程序。

csproj文件中的某些设置无法从VS中的设置屏幕进行编辑,无法将类库转换为WCF服务库,需要将以下内容添加到项目文件中

将以下内容添加到第一个PropertyGroup [这些是C#WCF项目的指南]

<ProjectTypeGuids>{3D9AD99F-2412-4246-B90B-4EAA41C64699};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>

有关ProjectTypeGuids

的详情,请参阅此处

您可能还需要在下面添加以下行:

<StartArguments>/client:"WcfTestClient.exe"</StartArguments>

但最终需要手动插入PropertyTypeGuids才能让VS将项目识别为WCF服务库项目。

答案 1 :(得分:1)

这是我将类库转换为WCF REST应用程序所必须做的。

1)修改.csproj文件并将以下两行添加到.csproj文件中的第一个PropertyGroup元素。

<ProjectTypeGuids>{349c5851-65df-11da-9384-00065b846f21};{fae04ec0-301f-11d3-bf4b-00c04f79efbc}</ProjectTypeGuids>
<UseIISExpress>false</UseIISExpress>

2)将以下行添加到<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />下面以导入Microsoft.WebApplication.targets文件

<Import Project="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v10.0\WebApplications\Microsoft.WebApplication.targets" />

3)将以下代码添加到</Project>标记之前的文件末尾。

<ProjectExtensions>
<VisualStudio>
  <FlavorProperties GUID="{349c5851-65df-11da-9384-00065b846f21}">
    <WebProjectProperties>
      <UseIIS>False</UseIIS>
      <AutoAssignPort>True</AutoAssignPort>
      <DevelopmentServerPort>50178</DevelopmentServerPort>
      <DevelopmentServerVPath>/</DevelopmentServerVPath>
      <IISUrl>
      </IISUrl>
      <NTLMAuthentication>False</NTLMAuthentication>
      <UseCustomServer>False</UseCustomServer>
      <CustomServerUrl>
      </CustomServerUrl>
      <SaveServerSettingsInUserFile>False</SaveServerSettingsInUserFile>
    </WebProjectProperties>
  </FlavorProperties>
</VisualStudio>

4)保存.csproj文件并重新加载项目。

5)将Web.Config文件添加到项目中,并添加以下几乎没有代码。您可以根据自己的要求稍后添加更多内容。

    <?xml version="1.0"?>
<configuration>

  <system.web>
    <compilation debug="true" targetFramework="4.0" />
  </system.web>

  <system.webServer>
    <modules runAllManagedModulesForAllRequests="true">
      <add name="UrlRoutingModule" type="System.Web.Routing.UrlRoutingModule, System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
    </modules>
  </system.webServer>

  <system.serviceModel>
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true"/>
    <standardEndpoints>
      <webHttpEndpoint>
        <!-- 
            Configure the WCF REST service base address via the global.asax.cs file and the default endpoint 
            via the attributes on the <standardEndpoint> element below
        -->
        <standardEndpoint name="" helpEnabled="true" automaticFormatSelectionEnabled="true"/>
      </webHttpEndpoint>
    </standardEndpoints>
  </system.serviceModel>

</configuration>

6)添加Global.asax文件。下面是一个示例文件。

    public class Global : HttpApplication
{
    void Application_Start(object sender, EventArgs e)
    {
        RegisterRoutes();
    }

    private void RegisterRoutes()
    {
        // Edit the base address of Service1 by replacing the "Service1" string below
        RouteTable.Routes.Add(new ServiceRoute("YourService", new WebServiceHostFactory(), typeof(YourServiceClass)));
    }
}

7)最后在项目的属性中,在构建选项卡下,如果输出路径设置为bin\Debug,请将其修改为bin\

答案 2 :(得分:0)

WCF不是点网。要创建WCF应用程序,您必须做四件事

  1. 定义服务合同
  2. 在服务器端实施合同
  3. 托管您已实施的服务
  4. 创建也可以使用服务合同的客户
  5. 看看这个tutorial

    这是服务及其主机的完整示例

    using System.ServiceModel;
    using System.ServiceModel.Description;
    using System.Runtime.Serialization;
    using System;
    
    [ServiceContract]
    public interface  AddStuff
    {
        [OperationContract]
        int Add(int X,int Y);
    }
    
    public class opAddStuff : AddStuff
    {
        public int Add(int X, int Y)
        {
            return X + Y;
        }
    }
    
    public class Pgm
    {
        static void Main(string[] args)
        {
            string httpAddr = "http://127.0.0.1:6001/AddStuff";
            string netAddr= "net.tcp://127.0.0.1:5001/AddStuff";
    
            System.ServiceModel.ServiceHost SH = new ServiceHost(typeof(opAddStuff),new Uri(httpAddr));
    
            BasicHttpBinding B = new BasicHttpBinding();
            NetTcpBinding NB = new NetTcpBinding();
    
            SH.AddServiceEndpoint(typeof(AddStuff), B, httpAddr);
            SH.AddServiceEndpoint(typeof(AddStuff), NB, netAddr);
    
    
    
            System.ServiceModel.Description.ServiceMetadataBehavior smb = SH.Description.Behaviors.Find<ServiceMetadataBehavior>();
            // If not, add one
            if (smb == null)
                smb = new ServiceMetadataBehavior();
    
            smb.HttpGetEnabled = true;
            smb.MetadataExporter.PolicyVersion = PolicyVersion.Policy15;
    
            SH.Description.Behaviors.Add(smb);
            SH.AddServiceEndpoint(  ServiceMetadataBehavior.MexContractName,  MetadataExchangeBindings.CreateMexHttpBinding(),  "mex");
    
            SH.Open();
    
            Console.WriteLine("Service at your service");
            string crap = Console.ReadLine();
    
    
    
        }
    }
    

    您还必须运行此命令

    netsh http add urlacl url = http://+:6001/AddStuff user = DOMAIN \ USER

    其中一些来自here