Ho creato un progetto come una libreria di classi. Ora ho bisogno di trasformarlo in una WCF. Posso creare un progetto WCF, ma vorrei evitare tutto il problema con TFS. Ho eseguito App.config e aggiunto la riga /client:"wcfTestClient.exe agli argomenti della riga di comando. Ma sembra esserci qualcos'altro che manca dal lancio dell'hosting.Quali passaggi devo seguire per convertire da una libreria di classi a una WCF?
risposta
WCF non è punto netto. Per creare un'applicazione WCF quello che dovete fare quattro cose
- Definire un contratto di servizio
- Attuare il contratto sul lato server
- Host il servizio implementato
- Creare un client che può anche utilizzare il servizio contratto
dare un'occhiata a questo tutorial
Thi s è un esempio completo di un servizio e il suo ospite
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();
}
}
È inoltre necessario eseguire questo comando
http netsh aggiungere urlacl url = http://+:6001/AddStuff user = dominio \ utente
una parte di questo viene da here
ho scoperto i seguenti fare il contrario di ciò che si sta cercando di ottenere, per esempio cambiando una biblioteca servizio per un'applicazione console ..
012.351.641.061.alcune delle impostazioni nei file csproj non possono essere modificate dalla schermata delle impostazioni da VS per convertire una libreria di classi in una libreria di servizi WCF è necessario aggiungere quanto segue al file di progetto
Aggiungere quanto segue al primo PropertyGroup
[questi sono i GUID per un progetto C# WCF]
<ProjectTypeGuids>{3D9AD99F-2412-4246-B90B-4EAA41C64699};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
Vedi qui per ulteriori informazioni sulle ProjectTypeGuids
potrebbe anche essere necessario aggiungere la seguente riga immediatamente sotto:
<StartArguments>/client:"WcfTestClient.exe"</StartArguments>
Ma alla fine sono i PropertyTypeGuids che è necessario inserire manualmente per consentire a VS di riconoscere il progetto come progetto della libreria di servizi WCF.
Questo è quello che dovevo fare per convertire la mia libreria di classi in applicazione REST WCF.
1) Modificare il file .csproj e aggiungere le due righe seguenti al primo elemento PropertyGroup nel file .csproj.
<ProjectTypeGuids>{349c5851-65df-11da-9384-00065b846f21};{fae04ec0-301f-11d3-bf4b-00c04f79efbc}</ProjectTypeGuids>
<UseIISExpress>false</UseIISExpress>
2) Aggiungere la seguente riga al di sotto <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
di importare file di Microsoft.WebApplication.targets
<Import Project="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v10.0\WebApplications\Microsoft.WebApplication.targets" />
3) Aggiungere il seguente codice alla fine del file prima del tag </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) Salvare il file .csproj e ricaricare il progetto.
5) Aggiungere un file Web.Config al progetto e aggiungere il seguente codice minimo. È possibile aggiungere più tardi in base alle proprie esigenze.
<?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) Aggiungere un file Global.asax. Di seguito è riportato un file di esempio.
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) Infine nelle proprietà del progetto, sotto scheda Genera, se il percorso di uscita è impostato bin\Debug
modificarlo per bin\
.
Ho creato il contratto di assistenza. Lo ha implementato. Ho un problema nel punto Host. Quando si crea un'applicazione WCF lo fa per te. Mi piacerebbe modificare un'applicazione di libreria di classi per farlo. –
Si sta ancora avviando un exe per il servizio e l'istanziazione del servizio. Questo è il mio problema, ho bisogno di Visual Studio per capirlo da solo come fa in una libreria di servizi WCF. –