2010-01-12 3 views
1

J'ai un service WCF avec deux méthodes, Ping et PutAddress. Ping fonctionne correctement, mais PutAddress ne parvenait pas à initialiser NHibernate correctement. En réduisant le problème, j'ai réalisé que les paramètres pertinents de Web.config n'étaient pas lus par PutAddress.WCF - Un OperationContract voit Web.config, un autre pas

Etrangement, Ping a ont accès aux paramètres de Web.config. J'ai enlevé tout le code de NHibernate et l'ai réduit juste pour essayer de lire les paramètres. Ping est capable de lire les paramètres (renvoie non-null, les valeurs dans résultat sont corrects) tandis que PutAddress 'résultat est null.

Encore une fois, NHibernate est maintenant complètement hors de l'image. Les deux méthodes essaient simplement de lire les paramètres pertinents à partir de Web.config. Ping réussit alors que PutAddress échoue.

Des pensées?

Interface:

[ServiceContract] 
public interface IMyService 
{ 

    [OperationContract] 
    string Ping(); 

    [OperationContract] 
    Address PutAddress(Address address); 
} 

Mise en œuvre:

public class MyService : IMyService 
{ 
    public string Ping() 
    { 
     NHibernate.Cfg.ConfigurationSchema.HibernateConfiguration result = 
      (NHibernate.Cfg.ConfigurationSchema.HibernateConfiguration) 
     System.Configuration.ConfigurationManager.GetSection("hibernate-configuration"); 
     if (result == null) 
     { 
      System.Diagnostics.Debugger.Break(); // Does NOT break, "Pong" returned 
     } 

     return "Pong"; 
    } 

    public Address PutAddress(Address address) 
    { 
     NHibernate.Cfg.ConfigurationSchema.HibernateConfiguration result = 
      (NHibernate.Cfg.ConfigurationSchema.HibernateConfiguration) 
      System.Configuration.ConfigurationManager.GetSection("hibernate-configuration"); 
     if (result == null) 
     { 
      System.Diagnostics.Debugger.Break(); // Breaks, result is null 
     } 

     return address; // Return version potentially modified with DB-assigned ID 
    } 
} 

EDIT:

Voici le (aseptisé) Web.config

<?xml version="1.0"?> 
<configuration> 
    <configSections> 
    <!-- NHibernate Section --> 
    <section name="hibernate-configuration" type="NHibernate.Cfg.ConfigurationSectionHandler,NHibernate"/> 
    <!-- Log4Net Section --> 
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net"/> 
    </configSections> 
    <!-- NHibernate Configuration --> 
    <hibernate-configuration xmlns="urn:nhibernate-configuration-2.2"> 
    <session-factory> 
     <property name="dialect"> 
     NHibernate.Dialect.MySQLDialect 
     </property> 
     <property name="connection.provider"> 
     NHibernate.Connection.DriverConnectionProvider 
     </property> 
     <property name="connection.driver_class"> 
     NHibernate.Driver.MySqlDataDriver 
     </property> 
     <property name="connection.connection_string"> 
     Server=localhost;Database=DB;User ID=USER;Password=PASS 
     </property> 
     <property name="proxyfactory.factory_class">NHibernate.ByteCode.Castle.ProxyFactoryFactory, NHibernate.ByteCode.Castle</property> 
     <property name="show_sql">true</property> 
     <mapping assembly="MyService"/> 
    </session-factory> 
    </hibernate-configuration> 
    <!-- Log4Net Configuration --> 
    <log4net> 
    <appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender, log4net"> 
     <layout type="log4net.Layout.PatternLayout, log4net"> 
     <param name="ConversionPattern" value="%d %p %m%n"/> 
     </layout> 
    </appender> 
    <appender name="RollingFile" type="log4net.Appender.RollingFileAppender,log4net"> 
     <param name="File" value="log.txt"/> 
     <param name="AppendToFile" value="true"/> 
     <param name="DatePattern" value="yyyy.MM.dd"/> 
     <layout type="log4net.Layout.PatternLayout,log4net"> 
     <conversionPattern value="%d %p %m%n"/> 
     </layout> 
    </appender> 
    <root> 
     <priority value="DEBUG"/> 
     <appender-ref ref="ConsoleAppender"/> 
    </root> 
    <logger name="NHibernate" additivity="false"> 
     <level value="WARN"/> 
     <appender-ref ref="RollingFile"/> 
     <appender-ref ref="ConsoleAppender"/> 
    </logger> 
    <logger name="NHibernate.SQL" additivity="false"> 
     <level value="ALL"/> 
     <appender-ref ref="RollingFile"/> 
     <appender-ref ref="ConsoleAppender"/> 
    </logger> 
    </log4net> 

    <system.web> 
    <compilation debug="true" targetFramework="4.0" /> 
    </system.web> 
    <system.serviceModel> 
    <behaviors> 
     <serviceBehaviors> 
     <behavior> 
      <!-- To avoid disclosing metadata information, set the value below to false and remove the metadata endpoint above before deployment --> 
      <serviceMetadata httpGetEnabled="true"/> 
      <!-- 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.webServer> 
    <modules runAllManagedModulesForAllRequests="true"/> 
    </system.webServer> 

</configuration> 
+1

Pouvez-vous fournir une version aseptisée de votre web.config? – Randolpho

+0

Publié ......... –

+0

Êtes-vous capable de parcourir le code WCF dans un débogueur? Je soupçonne que cela pourrait être causé par un problème de sérialisation et non par un manque d'accès à web.config. Sinon, pourriez-vous utiliser 'Msgbox (" X ")' dans votre code pour vérifier le déroulement de l'exécution? –

Répondre

1

J'ai trouvé le problème - un appel provenait d'un test d'unité que j'ai codé à la main, qui utilise MyServiceClient qui a été généré par Visual Studio lorsque j'ai ajouté une référence de service. L'autre appel provenait d'un test unitaire créé par l'assistant de test d'unité Visual Studio (2010), qui instanciait simplement MyService en tant qu'objet. Le test unitaire généré par VS fonctionnait en cours de processus.

0

J'ai eu moi-même un problème bizarre . Je ne pouvais pas renvoyer des objets "DataTable" à partir d'une opération WCF. Je me demande s'il peut y avoir un problème avec le retour d'un objet "Address" à partir d'une opération WCF.

Je ne sais pas la réponse complète à votre question, mais je suggère ce qui suit

Dans votre code pour PutAddress, essayez de remplacer Address PutAddress(Address address); avec string PutAddress(Address address); et remplacer return address; avec return "Pong"

Ce faisant, vous constaterez le flux d'exécution à travers votre code. Assurez-vous que vous êtes en train de casser et de retourner null au lieu de renvoyer une valeur nulle de address.

Si le nouveau code renvoie null, vous avez en fait des difficultés à lire le fichier. Je soupçonne qu'il retournera réellement "Pong", indiquant que votre code renvoie Address, qui contient en quelque sorte null à cause de l'étrangeté WCF.

+0

J'ai changé PutAddress pour accepter et retourner une chaîne. Aussi changé à la fois juste retourner "NO CONFIG - Ping"/"NO CONFIG - PutAddress" au lieu de percer dans le débogueur. Ping réussit toujours et PutAddress échoue toujours. –

Questions connexes