I've created a WCF Restful Service which works fine in most circumstances:
[OperationContract(Name = "OrderResponse")]
[WebInvoke(Method = "POST", UriTemplate = "OrderResponse")]
void PostOrderResponse(Stream ordata);
However if the content-type of the incoming request is set to the following:
"text/xml; charset=Windows-1252"
the client POST to the api gets a HTTP Response 400 and the following shows up in the wcf trace logs:
The default content type mapper selected the request format, 'Xml', given the request's content-type, 'text/xml; charset=Windows-1252'.
Unrecognized charSet 'Windows-1252' in contentType.
I'm pretty sure the error is being thrown before any code is called as the code behind will either set the response to HTTP 202 or 406 depending on what is sent through or if any error is thrown:
public void PostOrderResponse(Stream ordata)
{
try
{
// convert Stream Data to byte array
using (var streamReader = new MemoryStream())
{
ordata.CopyTo(streamReader);
data = streamReader.ToArray();
}
//if no data reject (http response)
if (data.Length == 0)
{
SetResponseHttpStatus(HttpStatusCode.NotAcceptable);
}
else
{ //convert byte[] to string
xmlString = enc.GetString(data);
conl = new SqlConnection(strConnString);
conl.Open();
SqlCommand cmdl = new SqlCommand("Insert_MSXML_MS_POR", conl);
cmdl.CommandType = CommandType.StoredProcedure;
cmdl.Parameters.Add(new SqlParameter("@DATA", xmlString));
SqlDataReader sdrl = cmdl.ExecuteReader();
sdrl.Close();
conl.Close();
SetResponseHttpStatus(HttpStatusCode.Accepted);
}
}
catch
{
SetResponseHttpStatus(HttpStatusCode.NotAcceptable);
}
data = null;
}
Relevant Web.config data:
<services>
<service name="MWHMSXML_v1.MSXML" behaviorConfiguration="MSXML_Connect" >
<endpoint address="" binding="webHttpBinding" contract="MWHMSXML_v1.IMSXML" bindingConfiguration="secureHttpBinding" behaviorConfiguration="webHttp" />
<endpoint name="mexHttpsBinding" address="mex" binding="mexHttpsBinding" contract="IMetadataExchange" />
</service>
</services>
<bindings>
<webHttpBinding>
<binding name="secureHttpBinding">
<security mode="Transport">
<transport clientCredentialType="None"/>
</security>
</binding>
</webHttpBinding>
</bindings>
Do I need to add something to the web.config file to accept the Window-1252 charset or how can I overcome this error?
EDIT I think I'm getting closer, I followed the instructions etc for creating a customtextmessageencoder and it seems to be working to a point. Looking through the trace logs the request (using 'Windows-1252' encoding) is hitting the correct endpoint but fails after opening the 'System.ServiceModel.InstanceContext' with the following error:
Incoming message for operation 'OrderResponse' (contract 'IMSXML' with namespace 'MWHMSXML_v1')does not contain a WebBodyFormatMessageProperty. This can be because a WebContentTypeMapper or a WebMessageEncodingBindingElement has not been configured on the binding. See the documentation of WebContentTypeMapper and WebMessageEncodingBindingElement for more details.
I've a feeling it's something to do with my web.config, the relevant bits are here:
<service name="MWHMSXML_v1.MSXML" behaviorConfiguration="MSXML_Connect" >
<endpoint address="" binding="customBinding" contract="MWHMSXML_v1.IMSXML "bindingConfiguration="customHttpBinding" behaviorConfiguration="webEndpoint"/>
<endpoint name="mexHttpsBinding" address="mex" binding="mexHttpsBinding" contract="IMetadataExchange" />
</service>
<customBinding>
<binding name="customHttpBinding" transferMode="Buffered" maxReceivedMessageSize="10485760">
<customTextMessageEncoding encoding="Windows-1252" mediaType="text/Xml" messageVersion="None"/>
<httpsTransport manualAddressing="true" />
</binding>
</customBinding>
<bindingElementExtensions>
<add name="customTextMessageEncoding" type=" MWHMSXML_v1.CustomTextMessageEncodingBindingSection, MWHMSXML_v1" />
</bindingElementExtensions>
<serviceBehaviors>
<behavior name="MSXML_Connect"> <serviceCredentials> <serviceCertificate findValue="*.myurl.com" storeLocation="LocalMachine" storeName="My" x509FindType="FindBySubjectName" /> </serviceCredentials> <serviceMetadata httpsGetEnabled="false" /><serviceDebug includeExceptionDetailInFaults="true"/></behavior> </serviceBehaviors>
I've searched & searched but can't find any info that's helpful with the above error.