What steps do I need to take to convert from a class library to a WCF?

我们两清 提交于 2019-12-19 17:43:13

问题


I created a project as a Class Library. Now I need to make it into a WCF. I can create a WCF project, but I would like to avoid all that fuss with TFS. I've done the App.config and added the /client:"wcfTestClient.exe" line to the Command line arguments. But there seems to be something else missing from it launching the Hosting.


回答1:


I discovered the following doing the opposite to what you are trying to achieve, i.e. changing a service library to a console application..

some of the settings in the csproj files cannot be edited from the settings screen from within VS to convert an class library to a WCF Service Library you need to add the following to your project file

Add the following to the first PropertyGroup [these are the guids for a C# WCF Project]

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

See here for further information on ProjectTypeGuids

You may also need to add the following line immediately below:

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

But ultimately it's the PropertyTypeGuids that you need to manually insert to get VS to recognise the project as a WCF Service Library Project.




回答2:


This is what I had to do to convert my class library to WCF REST application.

1) Modify the .csproj file and add the below two lines to the first PropertyGroup element in .csproj file.

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

2) Add the following line to below <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" /> to import Microsoft.WebApplication.targets file

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

3) Add the following code to the end of the file before the </Project> tag.

<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) Save the .csproj file and Reload the project.

5) Add a Web.Config file to the project and add the below bare minimal code. You can add more later per your requirement.

    <?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) Add a Global.asax file. Below is a sample file.

    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) Finally in the project's properties, under Build tab, if the output path is set to bin\Debug modify it to bin\.




回答3:


WCF is not dot net. To create a WCF application you have to do four things

  1. Define a service contract
  2. Implement the contract on the server side
  3. Host your implemented service
  4. Create a Client that also can use the service contract

take a look at this tutorial

This is a complete example of a service and its host

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();



    }
}

You also have to run this command

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

some of this comes from here



来源:https://stackoverflow.com/questions/1759307/what-steps-do-i-need-to-take-to-convert-from-a-class-library-to-a-wcf

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!