WCF异常:文本消息编码和ISO-8859-1编码 [英] WCF Exception: Text Message Encoding and ISO-8859-1 Encoding
问题描述
我正在尝试使用VS 2008,.net 3.5,WCF(环境:Windows XP和VS 2008)使用外部Web服务(Web服务有PHP实现) 。我添加服务引用到Web服务,VS生成WCF代理。
绑定是basicHttpBinding。
我打电话给方法在Web Service中,使用Proxy,然后我开始得到一个ProtocolException,我收到以下错误信息:
System.ServiceModel.ProtocolException:
内容类型为text / xml;
charset = ISO-8859-1的响应
消息与内容不匹配
类型的绑定(text / xml;
charset = utf-8)。如果使用自定义
编码器,请确保
IsContentTypeSupported方法正确执行
。
响应的前644个字节是:
这是成功的
嗯,我需要打电话服务于iso-8859-1编码。
解决问题的任何有用的示例源代码?
更新: p>
WCF中使用的默认编码器仅适用于UTF-8和UTF-16(大和小端)。
如果我在app.config中使用textEncoding =iso-8859-1绑定,
我收到此错误:
System.ArgumentException:No se admite
lacodificaciónde texto'iso-8859-1'
usada en el formato de mensaje de
texto 。 Nombre delparámetro:encoding。
System.ServiceModel.Channels.TextEncoderDefaults.ValidateEncoding(Encoding
encoding)
System.ServiceModel.Channels.TextMessageEncodingBindingElement。 set_WriteEncoding(Encoding
value)
System.ServiceModel.BasicHttpBinding.set_TextEncoding(Encoding
value)
System.ServiceModel.Configuration.BasicHttpBindingElement.OnApplyConfiguration(Binding
binding)
System.ServiceModel.Configuration.StandardBindingElement.ApplyConfiguration(绑定
绑定)
System.ServiceModel.Description.ConfigLoader.LookupBinding(String
bindingSectionName,String
configurationName,ContextInformation
上下文)
System.ServiceModel.Description.ConfigLoader.LoadChannelBehaviors(ServiceEndpoint
serviceEndpoint,String
configurationName)
System.ServiceModel.ChannelFactory.ApplyConfiguration(String
configurationName)
System.ServiceModel.Channe lFactory.InitializeEndpoint(String
configurationName,EndpointAddress
address)ctor(String
endpointConfigurationName,
EndpointAddress remoteAddress)
CreateSimplexFactory()
CreateChannelFactory()
CreateChannelFactoryRef(EndpointTrait`1
endpointTrait)
InitializeChannelFactoryRef()ctor()
IntegracionEasyVista.ServiceEasyVista.WebServicePortTypeClient..ctor()
在
更新:
调用使用WCF使用ISO-8859-1编码的Web服务
此MSDN页面( http://msdn.microsoft.com/en-us/library/ms751486(v = VS.90) .aspx )显示了如何创建CustomTextEncoder它可以支持超过utf-8,utf-16和unicode编码。它包含完整的示例源代码,对我来说非常有用。
我使用CustomTextMessageEncodingElement,但是我收到错误:
内容类型为text / xml; charset = ISO-8859-1的响应消息与绑定的内容类型不匹配(text / xml; charset = iso-8859-1)。如果使用自定义编码器,请确保IsContentTypeSupported方法已正确实施。响应的前1024个字节是:**
从示例代码MSDN,我从CustomTextMessageEncoder类修改构造函数: p>
public CustomTextMessageEncoder(CustomTextMessageEncoderFactory factory)
{
writerSettings = new XmlWriterSettings();
writerSettings.Encoding = Encoding.GetEncoding(factory.CharSet);
contentType = string.Format({0}; charset = {1},
factory.MediaType,this.writerSettings.Encoding.HeaderName);
}
将{0}; charset = {1}替换为{ 0}; charset = {1}(我已经包含一个空白)
然后,我收到错误:
传出消息的消息版本(Soap11( http:/ /schemas.xmlsoap.org/soap/envelope/ )AddressingNone
( http://schemas.microsoft.com/ws/2005/05/addressing/none ))与编码器的不一致性相符(例如:Soap12( http://www.w3.org/2003/05/soap-envelope )地址10 ( http://www.w3.org/2005/08/addressing )) 。
这个现有的答案是否有帮助? 调用使用ISO-8859-1的Web服务从WCF编码
Possible Duplicate:
Calling a webservice that uses ISO-8859-1 encoding from WCF
I am trying to consume an external Web Service (the web service has PHP implementation) using VS 2008, .net 3.5, WCF( Environment : Windows XP and VS 2008). I add Service Reference to Web Service, VS generates WCF Proxy.
Binding is basicHttpBinding.
I call to method in Web Service, using Proxy, then I started getting a ProtocolException, I received the following error message :
System.ServiceModel.ProtocolException: The content type text/xml; charset=ISO-8859-1 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 644 bytes of the response were:
This was successful
Well, I needed to call a service in iso-8859-1 encoding.
Any useful sample source code for solve it?
Update:
The default encoder used in WCF only works with UTF-8 and UTF-16 (big and little endian).
If I use textEncoding="iso-8859-1" in binding in app.config,
I get this error:
System.ArgumentException: No se admite la codificación de texto 'iso-8859-1' usada en el formato de mensaje de texto. Nombre del parámetro: encoding.
System.ServiceModel.Channels.TextEncoderDefaults.ValidateEncoding(Encoding encoding) System.ServiceModel.Channels.TextMessageEncodingBindingElement.set_WriteEncoding(Encoding value) System.ServiceModel.BasicHttpBinding.set_TextEncoding(Encoding value) System.ServiceModel.Configuration.BasicHttpBindingElement.OnApplyConfiguration(Binding binding) System.ServiceModel.Configuration.StandardBindingElement.ApplyConfiguration(Binding binding) System.ServiceModel.Description.ConfigLoader.LookupBinding(String bindingSectionName, String configurationName, ContextInformation context) System.ServiceModel.Description.ConfigLoader.LoadChannelBehaviors(ServiceEndpoint serviceEndpoint, String configurationName) System.ServiceModel.ChannelFactory.ApplyConfiguration(String configurationName) System.ServiceModel.ChannelFactory.InitializeEndpoint(String configurationName, EndpointAddress address) ctor(String endpointConfigurationName, EndpointAddress remoteAddress) CreateSimplexFactory() CreateChannelFactory() CreateChannelFactoryRef(EndpointTrait`1 endpointTrait) InitializeChannelFactoryRef() ctor() IntegracionEasyVista.ServiceEasyVista.WebServicePortTypeClient..ctor() in
Update:
Calling a web service that uses ISO-8859-1 encoding from WCF
Calling a webservice that uses ISO-8859-1 encoding from WCF
This MSDN page (http://msdn.microsoft.com/en-us/library/ms751486(v=VS.90).aspx) shows how to create a "CustomTextEncoder" which can support more than utf-8, utf-16 and unicode encodings. It includes full sample source code and was very useful for me to get things going.
I use CustomTextMessageEncodingElement, but I get error:
The content type text/xml; charset=ISO-8859-1 of the response message does not match the content type of the binding (text/xml;charset=iso-8859-1). If using a custom encoder, be sure that the IsContentTypeSupported method is implemented properly. The first 1024 bytes of the response were:**
From code of Samples MSDN, I modify the constructor from CustomTextMessageEncoder class:
public CustomTextMessageEncoder(CustomTextMessageEncoderFactory factory)
{
writerSettings = new XmlWriterSettings();
writerSettings.Encoding = Encoding.GetEncoding(factory.CharSet);
contentType = string.Format("{0};charset={1}",
factory.MediaType, this.writerSettings.Encoding.HeaderName);
}
I replace "{0};charset={1}" by "{0}; charset={1}" (I have included an blank)
Then, I get the error:
The message version of the outgoing message (Soap11 (http://schemas.xmlsoap.org/soap/envelope/) AddressingNone
(http://schemas.microsoft.com/ws/2005/05/addressing/none)) does not match that of the encoder
(Soap12 (http://www.w3.org/2003/05/soap-envelope) Addressing10 (http://www.w3.org/2005/08/addressing)).
Make sure the binding is configured with the same version as the message.
Does this existing answer help? Calling a webservice that uses ISO-8859-1 encoding from WCF
这篇关于WCF异常:文本消息编码和ISO-8859-1编码的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!