我创建了一个项目作为类库。现在我需要将它变成一个WCF。我可以创建一个WCF项目,但我想避免与TFS一起大惊小怪。我已经完成了App.config并将/client:"wcfTestClient.exe“行添加到了命令行参数中。但是,它似乎还有其他东西在推出主机时缺失。
答案 0 :(得分:12)
我发现以下内容与您要实现的目标相反,即将服务库更改为控制台应用程序。
csproj文件中的某些设置无法从VS中的设置屏幕进行编辑,无法将类库转换为WCF服务库,需要将以下内容添加到项目文件中
将以下内容添加到第一个PropertyGroup
[这些是C#WCF项目的指南]
<ProjectTypeGuids>{3D9AD99F-2412-4246-B90B-4EAA41C64699};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</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应用程序,您必须做四件事
看看这个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