WCF的一个怪异问题,高手请进

原创 2015年05月19日 14:12:30

今天遇到一个问题,系统基于WCF框架,不同的服务完全相似的代码,一个就报错,一个成功。而且报错的代码其实际顺利运行完毕所有代码,事务也成功地提交了,只是在返回信息时WCF给了一个错误信息:

<Fault xmlns="http://schemas.microsoft.com/ws/2005/05/envelope/none"><Code><Value>Receiver</Value><Subcode><Value xmlns:a="http://schemas.microsoft.com/net/2005/12/windowscommunicationfoundation/dispatcher">a:InternalServiceFault</Value></Subcode></Code><Reason><Text xml:lang="zh-CN">message 对象已被释放。</Text></Reason><Detail><ExceptionDetail xmlns="http://schemas.datacontract.org/2004/07/System.ServiceModel" xmlns:i="http://www.w3.org/2001/XMLSchema-instance"><HelpLink i:nil="true"/><InnerException i:nil="true"/><Message>message 对象已被释放。</Message><StackTrace>   在 System.ServiceModel.Channels.ByteStreamMessage.InternalByteStreamMessage.get_Properties()
↵   在 System.ServiceModel.OperationContext.get_IncomingMessageProperties()
↵   在 System.ServiceModel.Web.IncomingWebRequestContext.get_UriTemplateMatch()
↵   在 System.ServiceModel.Description.WebHttpBehavior.TrySetupJavascriptCallback(String callbackParameterName)
↵   在 System.ServiceModel.Dispatcher.JavascriptCallbackMessageInspector.BeforeSendReply(Message& reply, Object correlationState)
↵   在 System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.BeforeSendReplyCore(MessageRpc& rpc, Exception& exception, Boolean& thereIsAnUnhandledException)</StackTrace><Type>System.ObjectDisposedException</Type></ExceptionDetail></Detail></Fault>

经过排查,发现是由于Web.Config文件中binging节点的 crossDomainScriptAccessEnabled="true" 属性导致的,去掉后一切正常。微软官方帮助文档说该属性是用来设定是否允许跨域脚本访问,不清楚为何该属性会导致上述问题。只不过我们项目暂时不存在跨域访问问题,故去掉没有大碍。


具体web.config配置文件和代码如下:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <system.serviceModel>
    <services>
      <service behaviorConfiguration="Service.ServiceBehavior" name="VME.Service.PictureService">
        <endpoint address="" behaviorConfiguration="VME.Service.ServiceAspNetAjaxBehavior"
          binding="webHttpBinding" contract="VME.Contract.IPictureService" bindingConfiguration="webBinding" />
      </service>
      <service behaviorConfiguration="Service.ServiceBehavior" name="VME.Service.ServiceService">
        <endpoint address="" behaviorConfiguration="VME.Service.ServiceAspNetAjaxBehavior"
          binding="webHttpBinding" contract="VME.Contract.IServiceService" bindingConfiguration="serviceBinding" />
      </service>
    </services>
    <behaviors>
      <endpointBehaviors>
        <behavior name="VME.Service.ServiceAspNetAjaxBehavior">
          <enableWebScript />
        </behavior>
      </endpointBehaviors>
      <serviceBehaviors>
        <behavior name="Service.ServiceBehavior">
          <serviceThrottling maxConcurrentCalls="50" maxConcurrentSessions="50" maxConcurrentInstances="50"/>
          <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true"/>
          <serviceDebug includeExceptionDetailInFaults="true" />
          <dataContractSerializer maxItemsInObjectGraph="2147483647"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <protocolMapping>
      <add binding="webHttpBinding" scheme="http" />
    </protocolMapping>
    <bindings>
      <webHttpBinding>
        <binding name="webBinding" useDefaultWebProxy="false" crossDomainScriptAccessEnabled="true"
                 maxReceivedMessageSize="2147483647" maxBufferSize="2147483647" maxBufferPoolSize="2147483647"
                 sendTimeout="00:01:00" openTimeout="00:01:00" receiveTimeout="00:01:00" closeTimeout="00:01:00"
                 transferMode="Streamed" hostNameComparisonMode="StrongWildcard">
          <readerQuotas maxArrayLength="2147483647" maxStringContentLength="2147483647" maxDepth="32" maxBytesPerRead="4096" maxNameTableCharCount="16384"/>
          <security mode="None"></security>
        </binding>
        <binding name="serviceBinding" useDefaultWebProxy="false" crossDomainScriptAccessEnabled="true"
                 maxReceivedMessageSize="2147483647" maxBufferSize="2147483647" maxBufferPoolSize="2147483647"
                 sendTimeout="00:01:00" openTimeout="00:01:00" receiveTimeout="00:01:00" closeTimeout="00:01:00"
                 transferMode="Streamed" hostNameComparisonMode="StrongWildcard">
          <readerQuotas maxArrayLength="2147483647" maxStringContentLength="2147483647" maxDepth="32" maxBytesPerRead="4096" maxNameTableCharCount="16384"/>
          <security mode="None"></security>
        </binding>
      </webHttpBinding>
    </bindings>
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true"
      multipleSiteBindingsEnabled="true" />
  </system.serviceModel>
</configuration>

[ServiceContract]
public interface IPictureService
{
    [OperationContract]
    [WebInvoke(Method = "POST", RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.WrappedRequest)]
    bool SendIdCardPicture(Stream idCardImg);
}

[ServiceContract]
public interface IServiceService
{
    [OperationContract]
    [WebInvoke(Method = "POST", RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.WrappedRequest)]
    bool AddService(Stream service);
}
上面IPictureService接口的程序是能正常返回信息,而IServiceService接口的程序就报错。

有高手请给予指点迷津,到底哪里出了问题。



用浏览器访问WCF

在开发的时候,为客户端编写代码访问
  • leftfist
  • leftfist
  • 2014年08月21日 23:43
  • 8623

我的WCF数据服务(一)瓶颈

起初,公司的网站是个小网站,每天访问几千IP,虽然我们两个技术看起来很忙,其实老板让做的东西都是些零碎东西,差不多百分之八十工作都是页面改版。看这个页面不顺眼,就改一版;那个页面不顺眼,也改一版。有时...
  • zl33842902
  • zl33842902
  • 2016年08月17日 18:25
  • 505

WCF并发管理(一)

(原创:灰灰虫的家http://hi.baidu.com/grayworm) 当多个线程同时访问相同的资源的时候就会产生并发,WCF缺省情况下会保护并发访问。 对并发访问需要恰当处理,控制不好不仅...
  • xiaoyiyz
  • xiaoyiyz
  • 2015年05月25日 18:42
  • 1395

(WCF初体验)WCF的认证和消息保护

最近做WCF开发,有个需求是在服务端做认证,网上查资料了解到可以用UserName和Password 来做认证,只需要写好配置文件和在服务端写好验证类就行了,但是网上普遍的博文都是需要用证书,而我自...
  • u010724686
  • u010724686
  • 2015年02月13日 17:09
  • 2108

使用Winform程序作为WCF服务的宿主

如果我们自己新建一个WCF服务库,生成了dll文件。那我们需要创建一个宿主程序,在本例中我们新建一个Winform程序作为WCF的宿主程序。 在网上很多教程里对创建过程写的很模糊,错误也很多。本...
  • sadleaflzh
  • sadleaflzh
  • 2017年08月03日 14:22
  • 257

wcf服务寄宿时,如何指定终结点三要素才不会出错

wcf中服务寄宿时,怎样制定服务契约、绑定和终结点地址。情形一:服务契约相同、绑定相同、地址相同using (ServiceHost serviceHost = new ServiceHost(typ...
  • tiana0
  • tiana0
  • 2016年12月23日 16:34
  • 745

一个WCF宿住如何发布两个接口

服务端 建立第一个接口ISrevice1: [ServiceContract] public interface IService1 { [Operatio...
  • wind_3278
  • wind_3278
  • 2017年05月26日 13:32
  • 675

WCF 入门教程一(动手新建第一个WCF程序并部署)

WCF的相关概念信息就不在此赘述了,网上一搜一大把。 现在让我们动手搭建我们的第一个wcf程序吧,具体流程如下: 1. 新建立空白解决方案,并在解决方案中新建项目,项目类型为:WCF服务应用程序。 ...
  • xunzaosiyecao
  • xunzaosiyecao
  • 2015年03月07日 20:15
  • 3736

WCF是什么?它有什么优势?

 Windows Communication Foundation (WCF)是Microsoft为构建面向服务的应用提供的分布式通信编程框架,是.NET Framework 3.5的重要组成部...
  • hdhai9451
  • hdhai9451
  • 2015年03月09日 15:54
  • 1645

调试WCF服务碰到的问题

写了个WCF的服务,本机测试都是OK的,但是客户那边测试,各种报错。 用FIREFOX的RestClient测试,本机和客户机器都OK。 本机环境:VS2015  .NET4.5 客户...
  • smile00_0
  • smile00_0
  • 2017年06月13日 15:33
  • 307
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:WCF的一个怪异问题,高手请进
举报原因:
原因补充:

(最多只允许输入30个字)