2010-04-29 9 views
12

He intentado seguir este tutorial para implementar una muestra de WCF en IIS. No puedo hacer que funcione. Este es un sitio alojado, pero tengo acceso de Administrador de IIS al servidor. Sin embargo, en el paso 2 del tutorial, no puedo "crear una nueva aplicación IIS que se encuentre físicamente en este directorio de aplicaciones". Parece que no puedo encontrar un elemento de menú, elemento de menú contextual o qué no para crear una nueva aplicación. He estado haciendo clic con el botón secundario en todas partes como loco y todavía no puedo descubrir cómo crear una nueva aplicación. Supongo que ese es probablemente el problema raíz, pero probé algunas otras cosas (que se describen a continuación) en caso de que ese no sea realmente el problema. Aquí está una foto de lo que veo en el Administrador de IIS, en caso de que mis palabras no hacen justicia:Implementación de WCF Tutorial App en IIS7: "No se pudo encontrar el tipo"

No add Application Here http://www.freeimagehosting.net/uploads/d6edbaaf3c.png

esto es "desplegado" en http://test.com.cws1.my-hosting-panel.com/IISHostedCalcService/Service.svc. El error dice:

The type 'Microsoft.ServiceModel.Samples.CalculatorService', 
provided as the Service attribute value in the ServiceHost directive, 
or provided in the configuration element 
system.serviceModel/serviceHostingEnvironment/serviceActivations 
could not be found. 

También probé para crear un directorio virtual (IISHostedCalc) en DotNetPanel que apunta a IISHostedCalcService. Cuando navego a http://test.com.cws1.my-hosting-panel.com/IISHostedCalc/Service.svc, entonces hay un error diferente:

This collection already contains an address with scheme http. 
There can be at most one address per scheme in this collection. 

Curiosamente, si hago clic en Ver aplicaciones, parece que el directorio virtual es una aplicación (ver imagen abajo) ... aunque, como según el mensaje de error anterior, no funciona.

Is this an app or not? http://www.freeimagehosting.net/uploads/f3230be046.png

De acuerdo con el tutorial, no hubo compilar involucrados; Me acaba de caer los archivos en el servidor como sigue dentro de la carpeta IISHostedCalcService:

service.svc 
Web.config 
<dir: App_Code> 
    Service.cs 

service.svc contiene:

<%@ServiceHost language=c# Debug="true" Service="Microsoft.ServiceModel.Samples.CalculatorService"%> 

(he intentado con comillas en el atributo C#, ya que esto parece un poco extraño sin comillas, pero no había ninguna diferencia)

Web.config contiene:

<?xml version="1.0" encoding="utf-8" ?> 
<configuration> 
    <system.serviceModel> 
    <services> 
     <service name="Microsoft.ServiceModel.Samples.CalculatorService"> 

     <!-- This endpoint is exposed at the base address provided by host:          http://localhost/servicemodelsamples/service.svc --> 
     <endpoint address="" 
        binding="wsHttpBinding" 
        contract="Microsoft.ServiceModel.Samples.ICalculator" /> 

     <!-- The mex endpoint is explosed at http://localhost/servicemodelsamples/service.svc/mex --> 
     <endpoint address="mex" 
        binding="mexHttpBinding" 
        contract="IMetadataExchange" /> 
     </service> 
    </services> 
    </system.serviceModel> 
    <system.web> 
    <customErrors mode="Off"/> 
    </system.web> 
</configuration> 

Service.cs contiene:

using System; 
using System.ServiceModel; 

namespace Microsoft.ServiceModel.Samples 
{ 

    [ServiceContract] 
    public interface ICalculator 
    { 
     [OperationContract] 
     double Add(double n1, double n2); 
     [OperationContract] 
     double Subtract(double n1, double n2); 
     [OperationContract] 
     double Multiply(double n1, double n2); 
     [OperationContract] 
     double Divide(double n1, double n2); 
    } 


    public class CalculatorService : ICalculator 
    { 
     public double Add(double n1, double n2) 
     { 
      return n1 + n2; 
     } 
     public double Subtract(double n1, double n2) 
     { 
      return n1 - n2; 
     } 
     public double Multiply(double n1, double n2) 
     { 
      return n1 * n2; 
     } 
     public double Divide(double n1, double n2) 
     { 
      return n1/n2; 
     } 
    } 
} 

Respuesta

7

Bueno, parece que tengo esto para trabajar. Todavía no puedo encontrar el elemento "Crear aplicación" en el Administrador de IIS. Esa parte es un poco frustrante, pero me alegro de que parece estar funcionando de todos modos.

Tenía crear el directorio físico IISHostedCalcService bajo wwwroot. Eso estaba creando cierta confusión; significaba que http://test.com.cws1.my-hosting-panel.com/IISHostedCalcService/Service.svc estaba casi funcionando, pero no debería. Moví IISHostedCalcService fuera de wwwroot y ahora el único lugar para acceder al servicio es http://test.com.cws1.my-hosting-panel.com/IISHostedCalc/Service.svc.

A continuación, acceder http://test.com.cws1.my-hosting-panel.com/IISHostedCalc/Service.svc era tirar que "Esta colección ya contiene una dirección con el esquema http
No puede haber como máximo una dirección por esquema en esta colección.". error. Resulta que la solución es agregar lo siguiente al archivo web.config, justo debajo del sistema.ServiceModel:

<serviceHostingEnvironment> 
    <baseAddressPrefixFilters> 
    <add prefix="http://test.com.cws1.my-hosting-panel.com"/> 
    </baseAddressPrefixFilters> 
</serviceHostingEnvironment> 

Después de eso me dieron un nuevo error cuando ccessing http://test.com.cws1.my-hosting-panel.com/IISHostedCalc/Service.svc: "El nombre de contrato IMetadataExchange no se pudo encontrar en la lista de contratos ejecutados por el servicio CalculatorService". Resulta que la solución a esto es modificar el archivo web.config de la siguiente manera (es decir, agregar la sección de comportamientos, y behaviorConfiguration = "SimpleServiceBehavior" en el elemento de servicio):

<configuration> 
    <system.serviceModel> 
    <serviceHostingEnvironment> 
     <baseAddressPrefixFilters> 
     <add prefix="http://test.com.cws1.my-hosting-panel.com"/> 
     </baseAddressPrefixFilters> 
    </serviceHostingEnvironment> 
    <services> 
     <service name="Microsoft.ServiceModel.Samples.CalculatorService" behaviorConfiguration="SimpleServiceBehavior"> 
     ... 
     </service> 
    </services> 
    <behaviors> 
     <serviceBehaviors> 
     <behavior name="SimpleServiceBehavior"> 
      <serviceMetadata httpGetEnabled="True" policyVersion="Policy15" /> 
     </behavior> 
     </serviceBehaviors> 
    </behaviors> 
    </system.serviceModel> 
    <system.web> 
    <customErrors mode="Off"/> 
    </system.web> 
</configuration> 

Finalmente, pude crear proxies de cliente apuntando svcutil al http://test.com.cws1.my-hosting-panel.com/IISHostedCalc/service.svc?wsdl en el paso 5c del tutorial al http://msdn.microsoft.com/en-us/library/ms733133.aspx. Sin embargo, cuando ejecuté el cliente, recibí el error "El que llama no fue autenticado por el servicio". La solución a esto fue la más simple: simplemente cambie binding = "wsHttpBinding" a binding = "basicHttpBinding" en el web.config del servicio y el web.config del cliente (o vuelva a ejecutar svcutil después de cambiar el web.config del servicio).

El web.config terminó pareciéndose a esto:

<?xml version="1.0" encoding="utf-8" ?> 
<configuration> 
    <system.serviceModel> 
    <serviceHostingEnvironment> 
     <baseAddressPrefixFilters> 
     <add prefix="http://test.com.cws1.my-hosting-panel.com"/> 
     </baseAddressPrefixFilters> 
    </serviceHostingEnvironment> 
    <services> 
     <service name="Microsoft.ServiceModel.Samples.CalculatorService" behaviorConfiguration="SimpleServiceBehavior"> 

     <!-- This endpoint is exposed at the base address provided by host:          http://localhost/servicemodelsamples/service.svc --> 
     <endpoint address="" 
        binding="basicHttpBinding" 
        contract="Microsoft.ServiceModel.Samples.ICalculator" /> 

     <!-- The mex endpoint is explosed at http://localhost/servicemodelsamples/service.svc/mex -->    
     <endpoint address="mex" 
        binding="mexHttpBinding" 
        contract="IMetadataExchange" /> 

     </service> 
    </services> 
    <behaviors> 
     <serviceBehaviors> 
     <behavior name="SimpleServiceBehavior"> 
      <!-- To avoid disclosing metadata information, set the value below to false and remove the metadata endpoint above before deployment --> 
      <serviceMetadata httpGetEnabled="true" policyVersion="Policy15" /> 
      <!-- To receive exception details in faults for debugging purposes, set the value below to true. Set to false before deployment to avoid disclosing exception information --> 
      <serviceDebug includeExceptionDetailInFaults="false"/> 
     </behavior> 
     </serviceBehaviors> 
    </behaviors> 
    </system.serviceModel> 
    <system.web> 
    <customErrors mode="Off"/> 
    </system.web> 
</configuration> 
+0

Por favor, intente Agregar aplicación (la respuesta de JDC) antes de hacer todo esto ... es mucho más fácil y trabajado para mí! – JoelFan

4

Con el fin de crear una nueva aplicación, haga clic en el nodo Sitio Web predeterminado. En el menú contextual, seleccione Agregar aplicación.

1

Tuve el mismo error y, para mí, el problema era que me faltaban los ensamblados en el servidor que el servicio necesitaba para compilar.

Todo lo que se describe aquí no fue necesario para mí.

Para saber cuál es su error, puede intentar mover sus archivos service.svc y service.svc.cs al directorio App_Code. De esta forma obtendrás un mensaje de error mejor relacionado con el error real que tienes.

En mi caso, el espacio de nombre que faltaba porque olvidé implementar algunos ensambles. Cargué los ensamblados que faltaban, ejecuté el servicio correctamente y luego volví a mover los archivos de servicios a los que pertenecían.

+0

Tuve este problema también. Necesitaba configurar "Copiar local" en uno de mis ensamblajes referenciados para incluirlo en mi sitio. – Paul

1

Tuve este problema.

  1. que mantienen los archivos publicados bajo wwwroot
  2. Haga clic en Examinar en el archivo .svc
  3. Esta tirar misma excepción

Resolución

  1. he creado un directorio virtual para el mismo
  2. Intenta buscar en el archivo .svc.

de Trabajo ...

Cuestiones relacionadas