2012-01-24 5 views
7

tengo algo como esto:Organizar un servicio WCF en un tema de página web: System.ArgumentException: ServiceHost sólo es compatible con los tipos de servicio de clase

MathServiceLibrary (Biblioteca Servicio WCF)

[ServiceContract] 
public interface IMathService 
{ 
     [OperationContract] 
     int Add(int x, int y); 
     [OperationContract] 
     int Multiply(int x, int y); 
} 

public class MathService : IMathService 
{ 
     public int Add(int x, int y) 
     { 
      return x + y; 
     } 

     public int Multiply(int x, int y) 
     { 
      return x * y; 
     } 
} 

<behaviors> 
    <serviceBehaviors> 
     <behavior name="defaultServiceBehavior"> 
     <serviceMetadata httpGetEnabled="true" /> 
     </behavior> 
    </serviceBehaviors> 
</behaviors> 
<services> 
    <service behaviorConfiguration="defaultServiceBehavior" 
      name="MathServiceLibrary.MathService"> 
     <endpoint 
      address="mex" 
      binding="mexHttpBinding" 
      contract="IMetadataExchange" /> 
     <endpoint 
      address="math" 
      binding="wsHttpBinding" 
      contract="MathServiceLibrary.IMathService" /> 
     <host> 
      <baseAddresses> 
      <add baseAddress="http://localhost:8080/" /> 
      </baseAddresses> 
     </host> 
    </service> 
</services> 

Si funciono esto puedo ver el WCF Test Client y todo está bien.

Ahora quiero alojar este servicio en IIS así que creo un sitio web y agrego una referencia al MathServiceLibrary.

tengo este ms.svc

<%@ ServiceHost Language="C#" Debug="true" 
    Service="MathServiceLibrary.IMathService" %> 

y esto web.config

<system.serviceModel> 
     <services> 
      <service behaviorConfiguration="defaultServiceBehavior" name="MathServiceLibrary.MathService"> 
       <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/> 
       <endpoint address="" binding="wsHttpBinding" contract="MathServiceLibrary.IMathService"> 
        <identity> 
         <dns value="localhost"/> 
        </identity> 
       </endpoint> 
      </service> 
     </services> 
     <behaviors> 
      <serviceBehaviors> 
       <behavior name="defaultServiceBehavior"> 
        <serviceMetadata httpGetEnabled="true"/> 
        <serviceDebug includeExceptionDetailInFaults="false"/> 
       </behavior> 
      </serviceBehaviors> 
     </behaviors> 
     <serviceHostingEnvironment multipleSiteBindingsEnabled="true" /> 
    </system.serviceModel> 

Cuando hago clic derecho en ms.svc vista en el navegador me sale esto:

Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.

Exception Details: System.ArgumentException: ServiceHost only supports class service types.

Source Error:

An unhandled exception was generated during the execution of the current web request. Information regarding the origin and location of the exception can be identified using the exception stack trace below.

Stack Trace:

[ArgumentException: ServiceHost only supports class service types.]
System.ServiceModel.Description.ServiceDescription.GetService(Type serviceType) +12229075
System.ServiceModel.ServiceHost.CreateDescription(IDictionary`2& implementedContracts) +55
System.ServiceModel.ServiceHostBase.InitializeDescription(UriSchemeKeyedCollection baseAddresses) +154
System.ServiceModel.ServiceHost.InitializeDescription(Type serviceType, UriSchemeKeyedCollection baseAddresses) +49
System.ServiceModel.ServiceHost..ctor(Type serviceType, Uri[] baseAddresses) +151
System.ServiceModel.Activation.ServiceHostFactory.CreateServiceHost(Type serviceType, Uri[] baseAddresses) +30
System.ServiceModel.Activation.ServiceHostFactory.CreateServiceHost(String constructorString, Uri[] baseAddresses) +420
System.ServiceModel.HostingManager.CreateService(String normalizedVirtualPath) +1440
System.ServiceModel.HostingManager.ActivateService(String normalizedVirtualPath) +44
System.ServiceModel.HostingManager.EnsureServiceAvailable(String normalizedVirtualPath) +615

[ServiceActivationException: The service '/MathWebSite/ms.svc' cannot be activated due to an exception during compilation. The exception message is: ServiceHost only supports class service types..]
System.Runtime.AsyncResult.End(IAsyncResult result) +679246
System.ServiceModel.Activation.HostedHttpRequestAsyncResult.End(IAsyncResult result) +190
System.ServiceModel.Activation.HostedHttpRequestAsyncResult.ExecuteSynchronous(HttpApplication context, String routeServiceVirtualPath, Boolean flowContext, Boolean ensureWFService) +234
System.ServiceModel.Activation.HttpModule.ProcessRequest(Object sender, EventArgs e) +355
System.Web.SyncEventExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +148
System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +75

que no puedo entender lo que me estoy perdiendo

Respuesta

13

Cambiar la ms.svc como a continuación

<%@ ServiceHost Language="C#" Debug="true" Service="MathServiceLibrary.MathService" % > 

Hay que darle el nombre de clase en lugar de nombre de la interfaz

+0

gracias, funciona. – gigi

3

Su archivo .svc está mal. Hace referencia a la interfaz, no a la implementación. Cámbielo a esto: <%@ ServiceHost Language="C#" Debug="true" Service="MathServiceLibrary.MathService" %>

+0

gracias, funciona. – gigi

+0

Tuve mi implementación en otro proyecto, no en el mismo espacio de nombres, ¿hay algún problema? – kbvishnu

3

El archivo svc necesita tener el nombre de la clase en lugar del nombre de la interfaz. Un archivo svc de muestra tiene los siguientes contenidos:

<%@ ServiceHost Language="C#" Debug="true" Service="SampleService.Service1" CodeBehind="Service1.svc.cs" %> 

Espero que ayude.

3

La entrada en el archivo de SVC está mal:

en lugar de:

<%@ ServiceHost Language="C#" Debug="true" 
    Service="MathServiceLibrary.IMathService" %> 

es necesario tener:

<%@ ServiceHost Language="C#" Debug="true" 
    Service="MathServiceLibrary.MathService" %> 

Es necesario definir la clase de implementación servicio en el atributo Service= - NO ¡el contrato de servicio!

Cuestiones relacionadas