WCF - 一个OperationContract看到Web.config,另一个没有

时间:2010-01-12 22:22:30

标签: wcf web-config

我有一个WCF服务,有两个方法,Ping和PutAddress。 Ping工作正常,但PutAddress无法正确初始化NHibernate。缩小问题范围,我意识到PutAddress没有读取Web.config中的相关设置。

奇怪的是,Ping 可以访问Web.config中的设置。我删除了所有的NHibernate代码并将其煮沸,只是尝试读取设置。当PutAddress'结果为空时,Ping能够读取设置(返回非空,结果中的值是正确的)。

同样,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>

2 个答案:

答案 0 :(得分:1)

发现问题 - 一次调用来自我手工编码的单元测试,它使用了我添加服务引用时由Visual Studio生成的MyServiceClient。另一个调用来自Visual Studio(2010)单元测试向导创建的单元测试,该向导仅将MyService实例化为对象。结果,VS生成的单元测试正在进行中。

答案 1 :(得分:0)

我自己有一个奇怪的问题。我无法从WCF操作返回“DataTable”对象。我想知道从WCF操作返回“地址”对象是否存在问题。

我不知道你问题的完整答案,但我建议如下

PutAddress的代码中,尝试将Address PutAddress(Address address);替换为string PutAddress(Address address);,并将return address;替换为return "Pong"

通过这样做,您将确定通过代码执行的流程。确保您实际上是在断开并返回null,而不是返回空值address

如果新代码返回null,那么您实际上无法从该文件中读取。我怀疑它实际上会返回“Pong”,表明你的代码正在返回Address,由于WCF的怪异,它以某种方式包含null。

相关问题