我正在编写WCF WebService以与我的Android项目一起工作。我有一个名为CreateOrder的方法,一切都很好,直到我注意到,如果我发送的XML数据文件太大,我会出现异常:
06-28 15:23:09.894: E/Błąd wątku mainThread / Sender(6988): java.io.IOException: HTTP request failed, HTTP status: 500
然后,我将我的Android项目库从"ksoap2-Android-assembly-3.0.0-jar-with-dependences"更改为"ksoap2-Android-assembly-3..0-RC.4-jar-with-dependencies",这就是错误现在的样子:
06-28 15:18:47.124:E/Błãd wãtku mainThread/Sender(6623):SoapFault-错误代码:"a:DescializationFailed"错误字符串:"格式化程序在尝试反序列化消息时引发异常:中的错误正在反序列化操作"CreateOrder"的请求消息正文。这个超过了最大字符串内容长度配额(8192),同时读取XML数据。可以通过更改XmlDictionaryReaderQuotas的MaxStringContentLength属性对象。257号线,位置38faultactor:"null"详细信息:null
在我意识到发生了什么之后,我改变了配额的大小等。我正在处理这个问题,因为两天都找不到解决方案。也许你们中的一些人看到我的WCF/Config有问题。我也过去了Android/LogCat的方法,但我认为这是WCF的问题。
这是我的WCF/App.config
<?xml version="1.0"?>
<configuration>
<system.web>
<compilation debug="true" targetFramework="4.0" />
<httpRuntime maxRequestLength="2147483647" />
</system.web>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/>
</startup>
<system.serviceModel>
<bindings>
<webHttpBinding>
<binding name="FoodsoftPortSoap11"
closeTimeout="00:01:00"
openTimeout="00:01:00"
receiveTimeout="00:10:00"
sendTimeout="00:01:00"
allowCookies="false"
bypassProxyOnLocal="false"
hostNameComparisonMode="StrongWildcard"
maxBufferSize="2147483647"
maxBufferPoolSize="2147483647"
maxReceivedMessageSize="2147483647">
<!--messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered"-->
<!--useDefaultWebProxy="true"-->
<readerQuotas maxDepth="2147483647"
maxStringContentLength="2147483647"
maxArrayLength="2147483647"
maxBytesPerRead="2147483647"
maxNameTableCharCount="2147483647" />
<security mode="None">
<transport clientCredentialType="None"
proxyCredentialType="None"
realm="" />
<!--<message clientCredentialType="UserName" algorithmSuite="Default" />-->
</security>
</binding>
</webHttpBinding>
<wsHttpBinding>
<binding name="newHTTPBinding"
maxBufferPoolSize="2147483647"
maxReceivedMessageSize="2147483647">
<readerQuotas maxDepth="2147483647"
maxStringContentLength="2147483647"
maxArrayLength="2147483647"
maxBytesPerRead="2147483647"
maxNameTableCharCount="2147483647" />
</binding>
</wsHttpBinding>
</bindings>
<client>
<endpoint address="basic"
binding="wsHttpBinding"
bindingConfiguration="newHTTPBinding"
contract="FudeoRef.FoodsoftPort"
name="newHTTPBinding">
</endpoint>
<endpoint address=""
binding="webHttpBinding"
bindingConfiguration="FoodsoftPortSoap11"
contract="FudeoRef.FoodsoftPort"
behaviorConfiguration="web"
name="FoodsoftPortSoap11" />
</client>
<behaviors>
<endpointBehaviors>
<behavior>
<webHttp />
</behavior>
</endpointBehaviors>
</behaviors>
</system.serviceModel>
</configuration>
安卓线程
Thread MainThread = new Thread() {
@Override
public void run() {
try {
Log.v("K","1 "+order);
final String METHOD_NAME = "CreateOrder";
final String SOAP_ACTION = "http://tempuri.org/IService1/CreateOrder";
final SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);
Log.v("K","2 "+order);
//request.addProperty("cXMLData", activity.getResources().getString(R.string.abc));
//Log.v("XMLString", activity.getResources().getString(R.string.abc));
//request.addProperty("cXMLData", TEST);
Log.v("K","ROZMIAR "+TEST.length());
request.addProperty("cXMLData", XMLString);
Log.v("K","3 "+order);
SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
Log.v("K","4 "+order);
envelope.dotNet=true;
Log.v("K","5 "+order);
Log.e("envelope",String.valueOf(envelope));
Log.e("envelope",String.valueOf(request));
activity.runOnUiThread (new Runnable(){
public void run() {
Print.MessageInform(activity, String.valueOf(request));
}
});
envelope.setOutputSoapObject(request);
Log.e("K1",envelope.toString());
Log.v("K","6 "+order);
HttpTransportSE androidHttpTransport = new HttpTransportSE(URL);
Log.v("K","7 "+order);
androidHttpTransport.call(SOAP_ACTION, envelope);
Log.e("K",envelope.toString());
Log.v("K","8 "+order);
// Retrieve response object
ResponseString = envelope.getResponse().toString();
Log.v("K","9 "+order);
Log.e("Przebieg synchronizacji","2. Wysłano zamówienie: "+order);
activity.runOnUiThread (new Runnable(){
public void run() {
//Print.MessageInform(activity, ResponseString);
Parser.ParseCreateOrder(order, ResponseString, activity);
}
});
}
catch (final Exception exc) {
activity.runOnUiThread(new Runnable(){
@Override
public void run() {
Log.e("Błąd wątku mainThread / Sender ", exc.toString());
}
});
}
}
};
LogCat
06-28 15:24:26.744:E/Przebieg synchronizaji(6988):1。乌鲁查米亚姆程序wysyłania zamówienia:3 06-28 15:24:27.104:V/K(6988):1 306-28 15:24:27.104:V/K(6988):2 3 06-28 15:24:27.104:V/K[6988]:罗马尼亚8767 06-28 15:24:27.104:V/K(6988):3 3 06-28 15:24:27.104:V/K(6988):4 3 06-28 15:24:27.104:V/K(6.98):5 3 06-28 13:24:27.104:E/信封(6988):org.ksoap2.serialization.SoapSerializationEnvelope@42d6b65806月28日15:24:27.104:E/envelope(6988):CreateOrder{cXMLData=06-2815:24:27.104:E/信封(6988):06-28 15:24:27.104:E/信封(6988):0.0 06-28 15:24:27.104:E/信封(6988):06-28 15:24:27.104:E/信封(6988):1001 06-28 15:24:27.104:E/信封(6988):06-2815:24:27.104:E/信封(6988):0。。。06月28日15:24:27.104:E/K1(6988):org.ksoap2.serialization.SoapSerializationEnvelope@42d6b65806月28日15:24:27.104:V/K(6988):6 3 06-28 15:24:27.104:V/K(7988):7 3 06-2815:24:27.144:D/dalvikvm(6988):GC_FOR_ALLOC释放6617K,31%释放15375K/22168K,暂停30ms,总计32ms 06-28 15:24:27.164:E/Dodaje(6988):命令3 06-28 15:24:27.164:E/Dodajie(698806-28 15:24:27.174:E/Dodaje(6988):订单5 06-28 15:24:27.174:E/Dodaje(6988):订单7 06-28 15:24:28.224:I/Choreographer(6988跳过66帧!应用程序可能在其主线程。06-28 15:24:28.364:E/Bł́d ẃtku主线程/发件人(6988):java.io.io异常:HTTP请求失败,HTTP状态:500
您的WCF服务配置中没有定义任何服务端点(您有客户端端点,这没有任何直接意义)。由于您没有在配置文件中明确定义端点,WCF将提供默认端点,并根据地址方案进行默认绑定。在http://
的情况下,这将是BasicHttpBinding
(除非覆盖配置文件中的协议设置)。
由于您获得的是默认绑定,因此您将获得默认设置,并且您在配置文件中对绑定所做的任何更改都不会应用于该服务,除非您a)将其设置为该服务的默认绑定配置,或者b)将该配置显式分配给给定的端点。
要使配置成为给定绑定的默认配置,只需省略name属性:
<bindings>
<webHttpBinding>
<binding closeTimeout="00:01:00"
......
但是,这并不能解决您的问题,因为您仍在使用BasicHttpBinding
(因为没有定义服务端点)。
对于您的情况,最简单的解决方案是将客户端端点更改为服务端点,并分配绑定配置(您已经这样做了,但它们目前是客户端端点):
<services>
<service name="<your service name>">
<endpoint address="basic"
binding="wsHttpBinding"
bindingConfiguration="newHTTPBinding"
contract="FudeoRef.FoodsoftPort"
name="newHTTPBinding" />
<endpoint address=""
binding="webHttpBinding"
bindingConfiguration="FoodsoftPortSoap11"
contract="FudeoRef.FoodsoftPort"
behaviorConfiguration="web"
name="FoodsoftPortSoap11" />
</service>
</services>