0

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

4

1 に答える 1

0

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>
于 2013-06-29T15:58:46.317 に答える