Android プロジェクトで動作するように WCF WebService を作成しています。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-dependencies」から「ksoap2-android-assembly-3.0.0-RC.4-jar-with-dependencies」に変更しました。エラーがどのように見えるか:
06-28 15:18:47.124: E/Błąd wątku mainThread / Sender(6623): SoapFault - faultcode: 'a:DeserializationFailed' faultstring: 'メッセージを逆シリアル化しようとしているときにフォーマッタが例外をスローしました: 要求本文の逆シリアル化でエラーが発生しました操作「CreateOrder」のメッセージ。XML データの読み取り中に、文字列コンテンツの最大長クォータ (8192) を超えました。このクォータは、XML リーダーの作成時に使用される XmlDictionaryReaderQuotas オブジェクトの MaxStringContentLength プロパティを変更することで増やすことができます。行 257、位置 38。faultactor: 'null' 詳細: null
何が起こっているのかを認識した後、クォータのサイズなどを変更しました。2日間解決策が見つからないため、この問題に取り組んでいます。私の 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>
Android スレッド
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
SoapSerializationEnvelope@42d6b658 06-28 15:24:27.104: V/K(6988): 6 3 06-28 15:24:27.104: V/K(6988): 7 3 06-28 15:24:27.144: D/ dalvikvm(6988): GC_FOR_ALLOC が解放された 6617K、31% の空き 15375K/22168K、一時停止 30 ミリ秒、合計 32 ミリ秒 06-28 15:24:27.164: E/Dodaje(6988): オーダー 3ドダジェ(6988): オーダー 4 06-28 15:24:27.174: E/ドダジェ(6988): オーダー 5 06-28 15:24:27.174: E/ドダジェ(6988): オーダー 7 06-28 15:24: 28.224: I/Choreographer(6988): 66 フレームスキップしました。アプリケーションがメイン スレッドで処理しすぎている可能性があります。06-28 15:24:28.364: E/Błąd wątku mainThread / Sender(6988): java.io.IOException: HTTP 要求が失敗しました、HTTP ステータス: 500 164: E/Dodaje(6988): オーダー 3 06-28 15:24:27.164: E/Dodaje(6988): オーダー 4 06-28 15:24:27.174: E/Dodaje(6988): オーダー 5 06-28 15:24:27.174: E/Dodaje(6988): order 7 06-28 15:24:28.224: I/Choreographer(6988): 66 フレームスキップしました! アプリケーションがメイン スレッドで処理しすぎている可能性があります。06-28 15:24:28.364: E/Błąd wątku mainThread / Sender(6988): java.io.IOException: HTTP 要求が失敗しました、HTTP ステータス: 500 164: E/Dodaje(6988): オーダー 3 06-28 15:24:27.164: E/Dodaje(6988): オーダー 4 06-28 15:24:27.174: E/Dodaje(6988): オーダー 5 06-28 15:24:27.174: E/Dodaje(6988): order 7 06-28 15:24:28.224: I/Choreographer(6988): 66 フレームスキップしました! アプリケーションがメイン スレッドで処理しすぎている可能性があります。06-28 15:24:28.364: E/Błąd wątku mainThread / Sender(6988): java.io.IOException: HTTP 要求が失敗しました、HTTP ステータス: 500