2010-01-12 25 views
1

我有一個WCF服務有兩種方法,Ping和PutAddress。 Ping工作正常,但PutAddress無法正確初始化NHibernate。縮小這個問題,我意識到來自Web.config的相關設置不會被PutAddress讀取。WCF - 一個OperationContract看到Web.config,另一個沒有

奇怪的是,Ping 確實有權訪問Web.config中的設置。我刪除了所有的NHibernate代碼,並將其簡化爲僅嘗試讀取設置。 Ping能夠讀取設置(返回非null,結果中的值是正確的),而PutAddress'結果爲空。

同樣,NHibernate現在完全不在圖片中。這兩種方法都只是嘗試從Web.config中讀取相關設置。在PutAddress失敗時Ping成功。

有什麼想法?

接口:

[ServiceContract] 
public interface IMyService 
{ 

    [OperationContract] 
    string Ping(); 

    [OperationContract] 
    Address PutAddress(Address address); 
} 

實現:

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 
    } 
} 

編輯:

這裏是(消毒)的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

你能否提供你的web.config的消毒版本? – Randolpho 2010-01-12 22:26:38

+0

發佈了......... – 2010-01-12 22:48:56

+0

你能夠在調試器中瀏覽WCF代碼嗎?我懷疑這可能是由序列化問題引起的,而不是由於缺少對web.config的訪問。否則,你可以在代碼中使用'Msgbox(「X」)'來確定執行流程嗎? – 2010-01-12 22:54:26

回答

1

發現問題 - 一次調用來自手動編碼的單元測試,它使用了當我添加服務引用時由Visual Studio生成的MyServiceClient。另一個調用來自Visual Studio(2010)單元測試嚮導創建的單元測試,該向導剛剛將MyService實例化爲對象。因此,VS生成的單元測試正在進行中。

0

我有一個奇怪的問題,我自己。我無法從WCF操作返回「DataTable」對象。我想知道從WCF操作中返回一個「Address」對象是否會有問題。

我不知道完整的回答你的問題,但我會建議以下

在你的代碼PutAddress,嘗試更換Address PutAddress(Address address);string PutAddress(Address address);和替換return address;return "Pong"

通過這樣做,您將確定通過您的代碼的執行流程。確保你實際上是中斷並返回null,而不是返回空值address

如果新代碼返回null,那麼您實際上在閱讀該文件時遇到困難。我懷疑它實際上會返回「Pong」,表示你的代碼正在返回Address,它由於WCF怪異而以某種方式包含null。

+0

我改變了PutAddress來接受並返回一個字符串。還改變了這兩個方法,只是返回「NO CONFIG - Ping」/「NO CONFIG - PutAddress」而不是進入調試器。 Ping仍然成功,PutAddress仍然失敗。 – 2010-01-12 22:59:03

相關問題