2010-02-04 8 views
1

J'écris un service WCF dans Visual Studio 2008 pour être hébergé sur un serveur Windows 2008 Standard.Service WCF 405 Méthode non autorisée Exception

J'ai créé un nouveau site Web dans IIS7 avec sa propre application destinée à ASP.NET 2.0. J'ai ajouté des fonctionnalités Framework .NET 3.0 au rôle de serveur. J'ai déjà parcouru toutes les étapes impliquant les extensions * .svc et le module aspnet_isapi. J'ai exécuté "ServiceModelReg -r" et ai redémarré IIS aussi bien que le serveur lui-même.

Mon projet cible le .NET Framework 3.5 pour les générations. Ma solution référence le projet en tant que site Web à l'aide d'un chemin UNC vers le répertoire Web du serveur. Le projet se construit sans erreur et je peux ajouter avec succès une référence de service à mon service WCF dans mon projet client (sur ma machine virtuelle de développement Win XP). Mon projet client génère et s'exécute, mais génère une exception lors de l'appel de la méthode de service (CheckDatabaseConnection). Mes classes web.config et service sont jointes ci-dessous, suivies de l'application client. Je n'ai plus d'idées!

web.config:

<system.serviceModel> 
    <serviceHostingEnvironment aspNetCompatibilityEnabled="false" /> 
    <services> 
     <service behaviorConfiguration="ConnectivityBehavior" name="EDCO.Web.Services.Connectivity"> 
      <endpoint address="http://validurl.net" binding="wsHttpBinding" contract="EDCO.Web.Services.IConnectivity"> 
      </endpoint> 
      <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/> 
     </service> 
    </services> 
    <behaviors> 
     <serviceBehaviors> 
      <behavior name="ConnectivityBehavior"> 
       <serviceMetadata httpGetEnabled="true"/> 
       <serviceDebug includeExceptionDetailInFaults="false"/> 
      </behavior> 
     </serviceBehaviors> 
    </behaviors> 
</system.serviceModel> 

IConnectivity.cs:

[ServiceContract(Namespace="http://validurl.net")] 
public interface IConnectivity 
{ 
    #region Methods 

    [WebGet()] 
    [WebInvoke(Method="GET")] 
    [OperationContract()] 
    bool CheckDatabaseConnection(string server, string database, string user, string password); 

    #endregion Methods 
} // interface IConnectivity 

Connectivity.svc.cs:

public class Connectivity : IConnectivity 
{ 
    #region Members 

    const string CONN_STRING = "Server={0};Database={1};User ID={2};Password={3};"; 

    #endregion Members 

    #region Methods 

    public bool CheckDatabaseConnection(string server, string database, string user, string password) 
    { 
     SqlConnection conn = null; 

     try 
     { 
      conn = new SqlConnection(string.Format(CONN_STRING, server, database, user, password)); 
      conn.Open(); 
     } 
     catch 
     { 
      return false; 
     } 
     finally 
     { 
      if (conn != null) 
      { 
       if (conn.State != ConnectionState.Closed) 
       { 
        conn.Close(); 
       } 
       conn.Dispose(); 
      } 
     } 

     return true; 
    } // CheckDatabaseConnection(server, database, user, password) 

    #endregion Methods 
} // class Connectivity 

Program.cs client:

class Program 
{ 
    #region Methods 

    static void Main(string[] args) 
    { 

     Connectivity.ConnectivityClient connect = new Connectivity.ConnectivityClient(); 

     Console.WriteLine("Establishing connection..."); 
     if (connect.CheckDatabaseConnection("dbServer", "dbName", "login", "password")) 
     { 
      Console.WriteLine("Successful connection!"); 
     } 
     else 
     { 
      Console.WriteLine("Connection failed."); 
     } 
     Console.ReadLine(); 
    } // Main() 

    #endregion Methods 
} // class Program 

Répondre

4

OK, il semble que je résolu le problème en ajoutant un élément d'identité à mon web.config. Assez curieusement, cela n'a pas été l'une des réponses flottant sur Internet, mais je suis tombé dessus en regardant un article presque sans rapport. La correction est la suivante:

 <service behaviorConfiguration="ConnectivityBehavior" name="EDCO.Web.Services.Connectivity"> 
      <endpoint address="http://validurl.net/Connectivity.svc" binding="wsHttpBinding" contract="EDCO.Web.Services.IConnectivity"> 
       <identity> 
        <dns value="validurl.net" /> 
       </identity> 
      </endpoint> 
      <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/> 
     </service> 
Questions connexes