Search code examples
c#wcfhttp.net-core

The content type text/xml; charset="utf-8" of the response message does not match the content type of the binding (text/xml; charset=utf-8)


Please note that this question pertains to the .NET Core implementation of WCF Connected Services.

I am porting a regular .NET WCF client over to .NET Core, but I ran into this issue:

The content type text/xml; charset="utf-8" of the response message does
not match the content type of the binding (text/xml; charset=utf-8).

If using a custom encoder, be sure that the IsContentTypeSupported method is
implemented properly. The first 1024 bytes of the response were: 
'<?xml version='1.0' encoding='UTF-8'?> [...]

The response indeed contains the quotes:

HTTP/1.1 200 Ok
content-type: text/xml; charset="utf-8"

I never did anything special to handle this in WCF proper. Is this a bug in the .NET Core version, or is it just really specific about the content type (utf-8 vs "utf-8")?

How can I change the expected content type to match the service I'm calling? (I have no control over that, but I can copy and alter the WSDL if needed).

I'm using a svcutil-generated client. (Connected Service)


Solution

  • It would indeed seem that the .NET Core version is more picky about this. In any case, I managed to solve it using a Custom Encoder.

    I blatently stole the CustomTextMessageEncoder from Github. I added the following method:

    public override bool IsContentTypeSupported(string contentType)
    {
        return true;
    }
    

    And stole CustomTextMessageBindingElement and CustomTextMessageEncoderFactory from the same place.

    I added them by creating a custom binding (basicBinding is the binding I had before):

    var customBindingElement = new CustomTextMessageBindingElement("UTF-8", "text/xml", MessageVersion.Soap11);
    var binding = new CustomBinding(basicBinding);
    binding.Elements.RemoveAt(0);
    binding.Elements.Insert(0, customBindingElement);
    var client = (T2)Activator.CreateInstance(typeof(T), binding, address);
    

    I use Activator as I generate my proxies dynamically. Just replace with a call to the WCF generated client.

    Quite a lot of work for two misplaced quotes :D