views:

317

answers:

1

Hi

My system is Windows 7 Ultimate 32 bit. Running Visual Studio 2010 beta 2 targeting .Net 4.

I have a project containing service contracts.
A project containing the services.
And an ASP.NET Web Application that is hosting the services in IIS.

I've written my own Clients using the ChannelFactory().CreateChannel()...

Whenever I run my application that uses the ServiceClient and calls a method on the service, I get this error:

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

I've tried to add a service reference in VS, so that the service client is auto-generated and that doesn't change anything.

Then I tried to create a new WCF Service Application from the Web category in VS2010, adding a service reference and calling the standard GetData method That works fine, so it is for sure my service or the hosting of the service that goes wrong...

UPDATE

I noticed that this error was only present when using wsHttpBindings. basicHttpBindings works fine.

This is how I instantiate the service:

private IAdminService _AdminService;

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

Client config settings:

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

My service looks like this:

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

My AdminService.svc file looks like this:

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

My Service Host config looks like this:

<?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>
        <!-- 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>

I've also tried to create a new Console App, and add a service reference to http://AdminServices/svcs/AdminService.svc - that doesn't work either.

I've added AdminServices to my hosts file, and I can browse http://AdminServices/svcs/AdminService.svc and see the service information...

+1  A: 

The most obvious cause would be that you are loading a 64 bits DLL into a 32 bits process or visa versa. However given that you are running everything on a a 32 bits development box I assume this isn't the case.

The other option is a .NET bug using a generic constraint like this:

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

If you remove the where T : class it should work just fine.

Maurice
I don't have any generic constraints like that.
MartinHN