BadImageFormatException IIS托管的WCF服务Win7 x86,VS2010b2

时间:2009-10-24 19:50:53

标签: wcf iis visual-studio-2010

我的系统是Windows 7 Ultimate 32位。运行Visual Studio 2010 beta 2,目标是.Net 4.

我有一个包含服务合同的项目 包含服务的项目 以及在IIS中托管服务的ASP.NET Web应用程序

我使用ChannelFactory()创建了自己的客户端.CreateChannel()......

每当我运行使用ServiceClient的应用程序并在服务上调用方法时,我都会收到此错误:

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

我尝试在VS中添加服务引用,以便自动生成服务客户端,并且不会更改任何内容。

然后我尝试从VS2010中的Web类别创建一个新的WCF服务应用程序,添加一个服务引用并调用标准的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" %>

我的服务主机配置如下所示:

<?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并查看服务信息......

1 个答案:

答案 0 :(得分:2)

最明显的原因是您将64位DLL加载到32位进程中,反之亦然。但是,鉴于您在32位开发盒上运行所有内容,我认为情况并非如此。

另一个选项是使用如下通用约束的.NET错误:

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

如果删除where T:class,它应该可以正常工作。