BadImageFormatException Служба WCF, размещенная в IIS, Win7 x86, VS2010b2

У меня установлена ​​32-разрядная версия Windows 7 Максимальная. Запуск бета-версии 2 Visual Studio 2010 для .Net 4.

У меня есть проект, содержащий сервисные контракты.
Проект, содержащий сервисы.
И веб-приложение ASP.NET, которое размещает сервисы в ИИС.

Я написал свои собственные клиенты, используя ChannelFactory().CreateChannel()...

Всякий раз, когда я запускаю свое приложение, которое использует ServiceClient и вызывает метод службы, я получаю эту ошибку:

An attempt was made to load a program with an incorrect format. 
   (Exception from HRESULT: 0x8007000B)

Я попытался добавить ссылку на службу в VS, чтобы клиент службы генерировался автоматически и ничего не менял.

Затем я попытался создать новое приложение-службу WCF из категории «Веб» в VS2010, добавив ссылку на службу и вызвав стандартный метод GetData. Он отлично работает, поэтому наверняка моя служба или хостинг службы не работают...

ОБНОВЛЕНИЕ

Я заметил, что эта ошибка присутствует только при использовании wsHttpBindings. basicHttpBindings работает нормально.

Вот как я создаю сервис:

private IAdminService _AdminService;

public AdminServiceClient()
{
    _AdminService = new ChannelFactory<IAdminService>(String.Empty)
                        .CreateChannel();
}

Параметры конфига клиента:

<system.serviceModel>
    <client>
        <endpoint address="http://AdminServices/svcs/AdminService.svc"  
                  binding="wsHttpBinding"  
                  contract="MyApp.Admin.Model.ServiceContracts.IAdminService" />
    </client>
</system.serviceModel>

Мой сервис выглядит так:

public class AdminService : IAdminService
{
    public User GetUserByEmail(string email)
    {
        throw new NotImplementedException();
    }

    public void CreateUser(string fullname, string email, 
              string encryptedPassword, 
              string encryptedPasswordQuestion, 
              string encryptedPasswordAnswer)
    {
        throw new NotImplementedException();
    }

    public IEnumerable<Application> GetApplications()
    {
        IEnumerable<Application> apps = new List<Application>();
        // Call data access layer method to retrieve Applications
        return apps;
    }

    public IEnumerable<ApplicationInstance> GetApplicationInstances(
                                             long? applicationId)
    {
        throw new NotImplementedException();
    }

    public Dictionary<string, string> GetApplicationsAndInstances()
    {
        Dictionary<string, string> appsAndInstances = 
                 new Dictionary<string, string>();
        appsAndInstances.Add("Dummy 1", "1");
        appsAndInstances.Add("Dummy 2", "2");
        return appsAndInstances;
    }
}

Мой файл AdminService.svc выглядит так:

<%@ ServiceHost Service="MyApp.Admin.Services.AdminService" %>

Конфигурация My Service Host выглядит следующим образом:

<?xml version="1.0"?>
<configuration>
  <system.web>
    <compilation debug="true"
                 targetFramework="4.0" />
  </system.web>
  <system.serviceModel>
    <services>
      <service name="MyApp.Admin.Services.AdminService">
        <endpoint address=""
                  binding="wsHttpBinding"
                  contract="MyApp.Admin.Model.ServiceContracts.IAdminService" />
      </service>
    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior>
           <serviceMetadata httpGetEnabled="true"/>
           <serviceDebug includeExceptionDetailInFaults="false"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>
  </system.serviceModel>
  <system.webServer>
    <modules runAllManagedModulesForAllRequests="true"/>
  </system.webServer>
</configuration>

Я также попытался создать новое консольное приложение и добавить ссылку на службу в http://AdminServices/svcs/AdminService.svc — тоже не работает.

Я добавил AdminServices в файл hosts и теперь могу просматривать http://AdminServices/svcs/AdminService.svc и посмотреть служебную информацию...


person MartinHN    schedule 24.10.2009    source источник


Ответы (1)


Наиболее очевидной причиной может быть то, что вы загружаете 64-битную DLL в 32-битный процесс или наоборот. Однако, учитывая, что вы используете все на 32-битной машине разработки, я предполагаю, что это не так.

Другой вариант — это ошибка .NET, использующая общее ограничение, подобное этому:

public class SpecificClass: BaseClass: where T : class { }

Если вы удалите класс where T :, он должен работать нормально.

person Maurice    schedule 25.10.2009
comment
У меня нет таких общих ограничений. - person MartinHN; 25.10.2009