23

誰かが何が起こったのかを知るのを手伝ってください。正常に動作する WCF サービスがありましたが、突然次のエラーが発生しました。

サーバーは意味のある応答を返しませんでした。これは、コントラクトの不一致、時期尚早のセッション シャットダウン、または内部サーバー エラーが原因である可能性があります。

数千のレコードを選択しても機能することを伝えなければなりませんが、データが巨大な場合、以前は正常に機能していましたが、このエラーが発生しました!

    private static string ConnString = "Server=127.0.0.1; Port=5432; Database=DBname; User Id=UName; Password=MyPassword;"
    DataTable myDT = new DataTable();

                NpgsqlConnection myAccessConn = new NpgsqlConnection(ConnString);
                myAccessConn.Open();
        string query = "SELECT * FROM Twitter";

                NpgsqlDataAdapter myDataAdapter = new NpgsqlDataAdapter(query, myAccessConn);

                myDataAdapter.Fill(myDT);
                foreach (DataRow dr in myDT.Rows)
                {
   **WHEN I HAVE TOO MANY RECORDS IT STOPS HERE**
        ...

web.config

<configuration>
    <system.web>
        <compilation debug="false" targetFramework="4.0" />
      <httpRuntime maxRequestLength="2147483647" executionTimeout="100000" />
    </system.web>
  <system.diagnostics>
    <trace autoflush="true" />
    <sources>
      <source name="System.ServiceModel"
              switchValue="Information, ActivityTracing"
              propagateActivity="true">
        <listeners>
          <add name="traceListener" type="System.Diagnostics.XmlWriterTraceListener" initializeData="Traces4.svclog"/>
        </listeners>
      </source>
    </sources>
  </system.diagnostics>
  <system.serviceModel>
        <bindings>
            <basicHttpBinding>
                <binding name="BasicHttpBinding_IDBService" closeTimeout="00:30:00"
                    openTimeout="00:30:00" receiveTimeout="00:30:00" sendTimeout="00:30:00"
                    allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
                    maxBufferSize="2147483647" maxBufferPoolSize="2147483647" maxReceivedMessageSize="2147483647"
                    messageEncoding="Text" textEncoding="utf-8" transferMode="Streamed"
                    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>
            </basicHttpBinding>
        </bindings>
    <client>
      <endpoint address="" binding="basicHttpBinding" 
          bindingConfiguration="BasicHttpBinding_IDBService" contract="DBServiceReference.IDBService"
          name="BasicHttpBinding_IDBService" />
    </client>
        <behaviors>
            <serviceBehaviors>
                <behavior name="">
                  <serviceMetadata httpGetEnabled="true" />
                  <serviceDebug includeExceptionDetailInFaults="true" />
                  <dataContractSerializer maxItemsInObjectGraph="2147483646" />
                </behavior>
            </serviceBehaviors>
        </behaviors>
        <serviceHostingEnvironment aspNetCompatibilityEnabled="false" multipleSiteBindingsEnabled="true" />
    </system.serviceModel>
</configuration>

クライアント構成(編集済み)

<configuration>
        <system.serviceModel>
            <bindings>
                <basicHttpBinding>
                    <binding name="BasicHttpBinding_IRouteService" maxBufferSize="2147483647"
                        maxReceivedMessageSize="2147483647">
                        <security mode="None" />
                    </binding>
                    <binding name="BasicHttpBinding_IDBService" closeTimeout="00:30:00"
                        openTimeout="00:30:00" receiveTimeout="00:30:00" sendTimeout="00:30:00"
                        maxBufferSize="2147483647" maxReceivedMessageSize="2147483647"
                        transferMode="Buffered" >

                        <security mode="None" />
                    </binding>
                </basicHttpBinding>
                <customBinding>
                    <binding name="CustomBinding_IRouteService">
                        <binaryMessageEncoding />
                        <httpTransport maxReceivedMessageSize="2147483647"
                            maxBufferSize="2147483647" />
                    </binding>
                </customBinding>
            </bindings>

            <client>
                <endpoint address="http://dev.virtualearth.net/webservices/v1/routeservice/routeservice.svc"
                    binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_IRouteService"
                    contract="BingRoutingService.IRouteService" name="BasicHttpBinding_IRouteService" />
                <endpoint address="http://dev.virtualearth.net/webservices/v1/routeservice/routeservice.svc/binaryHttp"
                    binding="customBinding" bindingConfiguration="CustomBinding_IRouteService"
                    contract="BingRoutingService.IRouteService" name="CustomBinding_IRouteService" />
                <endpoint address="" binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_IDBService"
                    contract="DBServiceReference.IDBService" name="BasicHttpBinding_IDBService" />
            </client>
        </system.serviceModel>
    </configuration>

私のファイルscvlogでは、例外はありません! 問題がどこにあるかを理解するために他に何ができるか、他に考えがありません。誰か助けてください!!!

4

10 に答える 10

21

質問に対する一般的な回答を探していたので、誰かがここに到着した場合に備えて、別の回答です。

ロバ作業を行う DataContractSerializer は信じられないほど細かいようですが、常に実際のエラーをクライアントに渡すとは限りません。サーバー プロセスは障害の直後に終了します。したがって、エラーは見つかりません。私の場合、問題はフラグとして使用されたが、 [Flags] 属性で装飾されていない列挙型でした (うるさいか何か!)。

それを解決するために、シリアライザーのインスタンスを作成し、デバッガーでエラーを調べました。手元にあるので、ここにコードスニペットがあります。

編集:コメントでのリクエストに応じて...

現在使用しているヘルパー メソッドを示すようにコード スニペットを修正しました。以前とほとんど同じですが、便利な汎用ラッパーです。

public static T CheckCanSerialize<T>(this T returnValue) {
    var lDCS = new System.Runtime.Serialization.DataContractSerializer(typeof(T));

    Byte[] lBytes;
    using (var lMem1 = new IO.MemoryStream()) {
        lDCS.WriteObject(lMem1, returnValue);
        lBytes = lMem1.ToArray();
    }

    T lResult;
    using (var lMem2 = new IO.MemoryStream(lBytes)) {
        lResult = (T)lDCS.ReadObject(lMem2);
    }

    return lResult;
}

そしてこれを使うには、オブジェクトを返すのではなく、ヘルパーメソッドを呼び出してからオブジェクトを返すので、

public MyDodgyObject MyService() {
    ... do lots of work ...
    return myResult;
}

になる

public MyDodgyObject MyService() {
    ... do lots of work ...
    return CheckCanSerialize(myResult);
}

シリアル化のエラーは、サービスが注意を払うのをやめる前にスローされるため、デバッガーで分析できます。

ノート; 呼び出しを実稼働コードのままにすることはお勧めしません。オブジェクトのシリアル化と逆シリアル化のオーバーヘッドがあり、コードがデバッグされると実際のメリットはありません。

これが誰かの助けになることを願っています - 私はそれを追跡しようとして約3時間を無駄にしました.

于 2014-04-14T18:27:31.267 に答える
5

私の場合、WCF Web サービスと通信する Windows アプリ プロジェクトに取り組んでいました。netTcpBinding を使用する Web サービスは、Stream オブジェクト (画像) を返していました。

Windows アプリには構成ファイルがないため、バインディングには既定値が使用されます。そして、クライアント側のバックエンド コードで MaxReceivedMessageSize を拡張するだけで問題が解決しました。

var API = new StreamService.StreamServiceClient(
  new System.ServiceModel.NetTcpBinding(System.ServiceModel.SecurityMode.None)
  {
    MaxReceivedMessageSize = 2147483647
  },
  new System.ServiceModel.EndpointAddress("net.tcp://machine/app/service.svc")
);
于 2015-07-03T10:26:06.670 に答える
3

この問題は、バインディングのデフォルト値が原因でカットされた特大のメッセージが原因である場合があります。

maxReceivedMessageSize、maxBufferPoolSize、および maxBufferSizeを app.config ファイルのバインディングに十分な大きさの値とともに追加する必要があります - これでうまくいくはずです :)

例:

<bindings>
<netTcpBinding>
<binding 
name="ExampleBinding" closeTimeout="00:01:00"
maxReceivedMessageSize="73400320"
maxBufferPoolSize="70000000"
maxBufferSize="70000000"/>
</netTcpBinding>
</bindings>

幸運を!

于 2016-09-29T07:50:14.650 に答える
2

In my case I was working on an MVC application and I have changed

maxReceivedMessageSize ="10000000"

to

maxReceivedMessageSize ="70000000"

and it worked! It's because the response from the web server exceeds maxReceivedMessageSize ="10000000",
so I have increased maxReceivedMessageSize to maxReceivedMessageSize ="70000000".

于 2016-12-28T19:15:58.870 に答える
0

私にとっては、DB から取得したアイテムの遅延読み込みリストでした。

WCF レシーバーはそれらを反復しようとし、DB にアクセスしようとしますが、明らかに機能しませんでした。

于 2014-12-05T16:38:12.463 に答える
0

ASP.NET アプリケーションは、要求を行うユーザーの Windows ID (ユーザー アカウント) を使用して実行できます。偽装は、Microsoft インターネット インフォメーション サービス (IIS) に依存してユーザーを認証するアプリケーションでよく使用されます。ASP.NET の偽装は既定で無効になっています。

これを有効にすると、API が機能し始めます - IIS 認証にあります

于 2019-06-23T07:55:42.107 に答える