Search code examples
wcfformsauthenticationanonymous

WCF service not accessible in Windows Server 2008


I recently built a WCF Service, and now I'm deploying it to Windows Server 2008. Right now, we don't have secure protocol turned on. But we will. I'd like to get it working either way. In the site, I've had Anonymous authentication enabled as well as Forms authentication. The reason I did this was to prevent the authentication popup on the iPad, Android and Internet Explorer. So now they just get to the Login screen. Oh and I did activate WCF in Windows features. If you're also knowledgeable about making this https ready, I'd also like to figure that out. Thanks!!

I'm getting this error when I try pasting in the *.svc PATH into the URL.

System.ServiceModel.ServiceActivationException: The service '/WCFServices/Accessioning/QuickDataEntryService.svc' cannot be activated due to an exception during compilation

Here is my web.config configuration thus far.

<system.serviceModel>
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true">
        <!--<baseAddressPrefixFilters>
            <add prefix="http://localhost/" />
        </baseAddressPrefixFilters>-->
    </serviceHostingEnvironment>
    <behaviors>
        <endpointBehaviors>
            <behavior name="AspNetAjaxBehavior">
                <enableWebScript />
            </behavior>
        </endpointBehaviors>
        <serviceBehaviors>
            <behavior name="ServiceBehavior">
                <serviceDebug includeExceptionDetailInFaults="true" />
                <serviceMetadata httpGetEnabled="true" />
            </behavior>
            <!-- Watch this section when adding a new WCF Service!  New behaviors will be added; just delete them and use "ServiceBehavior" -->
        </serviceBehaviors>
    </behaviors>
    <services>
        <service behaviorConfiguration="ServiceBehavior" name="A.LIMS.UI.Web.WCFServices.Accessioning.QuickDataEntryService">
            <endpoint behaviorConfiguration="AspNetAjaxBehavior" binding="webHttpBinding"
                contract="A.LIMS.UI.Web.WCFServices.Accessioning.QuickDataEntryService" />
            <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
        </service>
        <!--<service name="A.LIMS.UI.Web.WCFServices.Accessioning.IQuickDataEntryService"
                 behaviorConfiguration="ServiceBehavior">
            <endpoint behaviorConfiguration="AspNetAjaxBehavior"
                      binding="webHttpBinding"
                      contract="A.LIMS.UI.Web.WCFServices.Accessioning.IQuickDataEntryService" />
        </service>-->
        <!-- Watch this section when adding a new WCF Service!  Duplicate the "QuickDataEntryService" above for an example, but change the fully qualified name -->
    </services>
</system.serviceModel>

Solution

  • I have no clue what caused the exception above, but here was the final verdict. There were a lot of things required for WCF and using an SSL certificate (HTTPS protocol). Pardon the formatting.. I don't like how Stack Overflow sometimes puts the code into a block and sometimes it doesn't.

    The following were required for the web.config on HTTPS:

    Here are some places that required the "requireSSL" attribute:

    <authentication mode="Forms"> <forms loginUrl="Login.aspx" timeout="30" protection="All" requireSSL="true" /> </authentication> <httpCookies httpOnlyCookies="false" requireSSL="true" domain="" />

    Notice the "s" in "httsGetEnabled" below:

    <behaviors> <endpointBehaviors> <behavior name="AspNetAjaxBehavior"> <enableWebScript /> </behavior> </endpointBehaviors> <serviceBehaviors> <behavior name="ServiceBehavior"> <serviceDebug includeExceptionDetailInFaults="true" /> <serviceMetadata httpsGetEnabled="true" /> </behavior> </serviceBehaviors> </behaviors>

    Bindings (missing in non-SSL web.config):

    <bindings> <webHttpBinding>
    <binding name="webBinding">
    <security mode="Transport"> </security>
    </binding>
    </webHttpBinding> </bindings>

    Services (notice the "s" in "mexHttpsBinding"):

        <services>
            <service behaviorConfiguration="ServiceBehavior" name="A.LIMS.UI.Web.WCFServices.Accessioning.QuickDataEntryService">
                <endpoint behaviorConfiguration="AspNetAjaxBehavior" binding="webHttpBinding" bindingConfiguration="webBinding" contract="A.LIMS.UI.Web.WCFServices.Accessioning.QuickDataEntryService" />
                <endpoint address="mex" binding="mexHttpsBinding" contract="IMetadataExchange" />
            </service>
    
        </services>
    

    Last but not least. I'm not using .NET 4.0, but I did try .NET on a different machine. With .NET 4.0 I couldn't get the WCF services to work without having this configured to the actual URL being used. If there were two domains for the same IP, WCF only worked with the domain in this block inside the system.ServiceModel XML block in the web.config. I did not test https in the .NET 4.0, so I'm assuming the protocol on the URL would be https below:

    <serviceHostingEnvironment aspNetCompatibilityEnabled="true"> <baseAddressPrefixFilters> <add prefix="http://subdomain.domain.com/" /> </baseAddressPrefixFilters> </serviceHostingEnvironment>

    Oh, I also had to turn on WCF on the Windows Server 2008 box. And it required a server reboot!