对 WCF 休息服务进行 Ajax 调用时出现 500 System.ServiceModel.ServiceActivationException

问题描述 投票:0回答:4

Ajax 调用:

   $.ajax({
        type: "POST",
        url: "http://SomeService/ServiceName.svc/GetSearchResults",
        data: JSON.stringify({ parameters: serviceParameters }),
        contentType: "application/json; charset=utf-8",
        dataType: "XML",
        success: function (response) {
            $("#xmlText").text(response.xml);
        },
        error: function (msg) {
            alert(msg.toString);
        }
    })

WCF接口:

[OperationContract]
        [WebInvoke(Method = "POST", BodyStyle = WebMessageBodyStyle.Wrapped, ResponseFormat = WebMessageFormat.Xml, RequestFormat = WebMessageFormat.Json,
                    UriTemplate = "GetSearchResults")]
        XElement GetSearchResults(inputParameters parameters);

        [OperationContract]
        [WebInvoke(Method = "POST", RequestFormat = WebMessageFormat.Json, UriTemplate = "getFile")]
        Stream GetFile(DocInfo info);

Web.config:

 <system.web>
    <compilation debug="true" targetFramework="4.0" />
    <customErrors mode="Off"/>
  </system.web>

 <system.webServer>
    <modules runAllManagedModulesForAllRequests="true"/>
  </system.webServer>

 <system.serviceModel>
   <serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true">
   </serviceHostingEnvironment>
   <standardEndpoints>
     <webHttpEndpoint>
       <standardEndpoint name="" helpEnabled="true" automaticFormatSelectionEnabled="true"></standardEndpoint>
     </webHttpEndpoint>
   </standardEndpoints>
 </system.serviceModel>

该服务托管在 IIS6 上。

当我致电该服务时,我收到以下错误消息:

500 System.ServiceModel.ServiceActivationException

我可以调用

GetFile
方法并获取响应流,但在调用
GetSearchResults
时收到错误消息。

任何帮助将不胜感激。

ajax wcf
4个回答
17
投票

我遇到此错误的原因如下

内存门检查失败,因为可用内存(258187264 字节)小于总内存的 5%。 因此,该服务将无法用于传入请求。 要解决此问题,请减少计算机上的负载或调整 serviceHostingEnvironment 配置元素上的 minFreeMemoryPercentageToActivateService 的值。


9
投票

非常感谢您富有启发的回复和评论。

我实际上遇到了同样的错误,但故事不同:

一开始,我收到“404(未找到)”服务器错误,这是因为我没有“HTTPS”的传输,而我已经有“HTTP”的传输。

我在

<httpsTransport>
元素中添加了
<binding>
,所以它看起来像这样:

<bindings>
  <customBinding>
    <binding name="CustomBinding_ITheService">
      <httpTransport keepAliveEnabled="True" transferMode="Streamed" authenticationScheme="None" maxBufferSize="2147483647" maxReceivedMessageSize="2147483647" manualAddressing="true" />
      <httpsTransport keepAliveEnabled="True" transferMode="Streamed" authenticationScheme="None" maxBufferSize="2147483647" maxReceivedMessageSize="2147483647" manualAddressing="true" />
    </binding>
  </customBinding>
</bindings>

然后我得到了

500 System.ServiceModel.ServiceActivationException
错误。但是,我导航“事件查看器 > Windows 日志 > 应用程序”,发现“不能为同一绑定定义多次传输”。因此,我决定为“HTTPS”传输添加一个带有新绑定的附加端点。

最后,我的配置如下所示:

<services>
  <service name="TheService" behaviorConfiguration="WebHttpBehavior_ITheService">
    <endpoint binding="customBinding" bindingConfiguration="CustomBinding_ITheService" contract="ITheService" behaviorConfiguration="EndPointBehavior_ITheService" />
    <endpoint binding="customBinding" bindingConfiguration="CustomBinding_ITheService_Secured" contract="ITheService" behaviorConfiguration="EndPointBehavior_ITheService" />
  </service>
</services>

<bindings>
  <customBinding>
    <binding name="CustomBinding_ITheService">
      <httpTransport keepAliveEnabled="True" transferMode="Streamed" authenticationScheme="None" maxBufferSize="2147483647" maxReceivedMessageSize="2147483647" manualAddressing="true" />
    </binding>
    <binding name="CustomBinding_ITheService_Secured">
      <httpsTransport keepAliveEnabled="True" transferMode="Streamed" authenticationScheme="None" maxBufferSize="2147483647" maxReceivedMessageSize="2147483647" manualAddressing="true" />
    </binding>
  </customBinding>
</bindings>

然后一切都会按正确的方式进行并且完美地运作。

如果您在 Visual Studio 上进行开发并使用 IIS-Express“Cassini”,请记住在网站项目的属性中启用 SSL 选项,这会告诉 IIS-Express 为您所使用的 HTTPS 传输准备一个基本 URL之前添加到绑定中。


1
投票

添加站点绑定转到 IIS => 然后默认网站 => 右键单击该 => 编辑绑定 => 单击“添加”按钮=> 在那里添加 HTTPS 绑定

详细信息如屏幕截图所示


0
投票

在更新过程中,我不小心用本地环境中的内容覆盖了 web.config 文件。重要的是,在预生产服务器上,某些部分(例如“connectionStrings”)已加密。但是,我本地环境中的 web.config

未加密
当我覆盖服务器上的文件时,应用程序无法启动,因为 IIS 和 .NET

期望这些部分

(例如 “connectionStrings”)采用加密格式,但我用未加密的数据替换了它们。更糟糕的是,IIS 没有提供任何有用的错误消息来指示该问题。 以下是一些防止这种情况发生的提示:

检查 web.config 的任何部分是否在服务器上加密: 在覆盖配置文件之前,请确保您没有 用纯文本替换加密部分。
  • 不要用未加密的内容覆盖加密的部分:如果 像“connectionStrings”或“appSettings”这样的部分是加密的 生产服务器,请勿使用未加密的数据覆盖它们。 这可能会导致应用程序启动失败。
  • 验证 XML 结构:即使部分已加密,也始终 仔细检查 XML 语法以确保没有结构问题 网络配置。
  • 这个问题是由
我的一个简单错误

引起的,我应该验证我没有替换加密部分。处理配置文件时一定要小心,尤其是在生产环境中!

© www.soinside.com 2019 - 2024. All rights reserved.