WCF Exists and partially working but for some call

2019-04-04 10:58发布

问题:

We have service that's working with small to large sets of data (document generation), and it's working fine for some calls, but for some specific requests (exact same method, different arguments) it just returns:

System.ServiceModel.EndpointNotFoundException: There was no endpoint listening at http://localhost:8010/MyService/MyService.svc that could accept the message. This is often caused by an incorrect address or SOAP action. See InnerException, if present, for more details. ---> System.Net.WebException: The remote server returned an error: (404) Not Found.

Note that the service is working, documents are generated but as I said not all of them... (and service can be opened from browser)

I've turned on tracing (system.diagnostics) in web.config and got no further info in the svclog.

The binding (wsHttp) is configured as:

    <binding name="wsHttpWithTrans" transactionFlow="True" messageEncoding="Mtom"  maxReceivedMessageSize="65536000" maxBufferPoolSize="124288000">
      <readerQuotas maxDepth="32" maxStringContentLength="819200" maxArrayLength="16384000" maxBytesPerRead="4096" maxNameTableCharCount="16384" />
      <security mode="None">
        <transport clientCredentialType="Windows" proxyCredentialType="None" realm="" />
        <message clientCredentialType="Windows" negotiateServiceCredential="true" algorithmSuite="Default" establishSecurityContext="true" />
      </security>
    </binding>

and also, there's:

<configuration>
  <system.web>
    <httpRuntime maxRequestLength="124288000" />
  </system.web>
</configuration>

I believe the message should fall within limits of maxReceivedMessageSize, and other attributes.

Currently I'm suspicious of the size of the message, but just cannot be sure - do you have any idea how can I debug this further?

回答1:

I found what was wrong using instructions on Troubleshooting Failed Requests Using Tracing in IIS 7 (very cool stuff btw)

There, I saw that the error was in fact the 404.13, which easily led me to what's really wrong: Content length too large.

In the end, the solution was to add this to web config:

<configuration>
...
  <system.webServer>
    <security>
      <requestFiltering>
        <requestLimits maxAllowedContentLength="204800000" />
      </requestFiltering>
    </security>
  </system.webServer>  
</configuration>

and, also, make sure that the default web site doesn't override it using:

"%WINDIR%\System32\inetsrv\appcmd.exe" list config "Default web site" -section:requestFiltering



回答2:

I found in addition to maxAllowedContentLength, the maxRequestLength on the server side in your WCF confgiration needs to be increased as well. I found that both values had to be increased for the exception to be resolved. In the .config for the WCF service server side make sure to add the following:

<system.web>
  <!--Increase 'maxRequestLength' to needed value: 100mb (value is in kilobytes)-->
  <httpRuntime maxRequestLength="102400"/>
</system.web>


回答3:

If you are suspicious about the content and/or length of the message, you can try to intercept the calls using something like Fiddler - that should set your mind at ease on those points.



回答4:

Check the name attribute of the service element in the web.config:

<configuration>
    <system.serviceModel>
        <services>
            <service name="...">

The service name should contain the correct namespace+classname. You can find this in de code or by looking in the markup of the .svc file (or open the .svc file with notepad) for the Service="..." attribute.