Error: Cannot process the message because the content type 'application/json; charset=utf-8 was not the expected type

10,876

Solution 1

I think you are facing some exception because you are doing some mistakes in binding and others.

For REST communication in WCF, you should use the webHttpBinding and not wsHttpBinding. Second you should mark the Photo property with DataMember.

  [DataContract]
  public class PhotoServiceResponse
  {
    [DataMember]
    public Byte[] Photo { get; set; }
  }

And you have to use the System.ServiceModel.Activation.WebServiceHostFactory in the svc file.

Ex.

<%@ ServiceHost Service="Service1" 
Factory="System.ServiceModel.Activation.WebServiceHostFactory" %>

Once you fixed this issues at-least you see some response in the client side and if the service is running in different domain make sure you have done enough settings in the service side for cross site communication.

Solution 2

Unless I'm really misreading your code, it looks like you try to return over Ajax a file as a byte array. This presents a couple of problems. First of all, as described in the jQuery API reference for Ajax return types, it appears you can't return files through Ajax using jQuery's built-in Ajax object. Second (and a bit more subjective), why aren't you just returning a URL to the file, especially if it happens to be a image? Unless you have a compelling reason, I'd just return the file URL in your Ajax result.

Solution 3

Try to add this on top of your class:

[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]

I had the same problem and it fixed it.

Share:
10,876
Asdfg
Author by

Asdfg

Always trying to do the hard thing. Not necessarily the hard way.

Updated on June 04, 2022

Comments

  • Asdfg
    Asdfg almost 2 years

    I am trying to invoke WCF service using jQuery and getting this error:

    "Cannot process the message because the content type 
    'application/json; charset=utf-8' was not the expected type 'multipart/related; 
    type="application/xop+xml"'."
    

    This is how my WCF service looks like:

    Interface:

    public interface IService
    {
    
        [OperationContract]
        [WebInvoke(Method = "POST",
          ResponseFormat = WebMessageFormat.Json)]
        PhotoServiceResponse GetPhoto();
    
    }
    
    [DataContract]
    public class PhotoServiceResponse
    {
        [MessageBodyMember]
        public Byte[] Photo { get; set; }
    }
    

    Implementation:

    [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
    public class Service : IService
    {
        #region IService Members
    
    
        public PhotoServiceResponse GetPhoto()
        {
            PhotoServiceResponse response = new PhotoServiceResponse();
            response.Photo = File.ReadAllBytes(@"C:\Temp\SomePic.bmp");
            return response; 
        }
    
        #endregion
    }
    

    Config:

    <system.serviceModel>
        <bindings>
          <wsHttpBinding>
            <binding name="WsHttpMtomBinding" maxReceivedMessageSize="5242880" messageEncoding="Mtom">
              <readerQuotas maxStringContentLength="655360" maxArrayLength="1310720" maxNameTableCharCount="1310720" maxBytesPerRead="327680" />
            </binding>
    
          </wsHttpBinding>
        </bindings>
    
        <behaviors>
          <serviceBehaviors>
            <behavior name="svcBehaviour">
              <serviceMetadata httpGetEnabled="true" />
              <serviceDebug includeExceptionDetailInFaults="true" />
            </behavior>
          </serviceBehaviors>
        </behaviors>
    
        <serviceHostingEnvironment aspNetCompatibilityEnabled="true" />
    
        <services>
          <service behaviorConfiguration="svcBehaviour"
                   name="Service">
            <endpoint address="" binding="wsHttpBinding"
               contract="IService"
               bindingConfiguration="WsHttpMtomBinding"/>
            <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
            <host>
              <baseAddresses>
                <add baseAddress="http://localhost:8081/Service" />
              </baseAddresses>
            </host>
          </service>
        </services>
      </system.serviceModel>
    

    This is how i am trying to access this service using jQuery AJAX:

       <script type="text/javascript">
        $.ajax({
          type: "POST",
          contentType: "application/json; charset=utf-8",
          url: "http://localhost:8081/Service/GetPhoto",
          data: "{}",
          crossDomain: true,
          dataType: "json",
          success: function (msg) {
                alert(msg);
          },
          error: function(jqXHR)
          {
            alert(jqXHR.statusText);
          }
        });
    
        </script>
    

    What is the reason i am getting this error? How do i fix it?

    Any help will he highly appreciated.

  • Asdfg
    Asdfg almost 12 years
    I am not returning the file. I am returning the bytes that i guess should not have problem transferring. And i cannot send the URL of the file as file resides on the local system and so as my WCF service.
  • devstruck
    devstruck almost 12 years
    If you can't make the resource available, you might try this technique. stackoverflow.com/questions/8734620/…