【问题标题】:ASP.Net Framework 4.0 WCF ConcurrencyASP.Net Framework 4.0 WCF 并发
【发布时间】:2014-06-25 11:33:55
【问题描述】:

我是 WCF 新手,我在 IIS 7 / Windows 2008 服务器上的托管 wcf 服务(.net 框架 4.0)中遇到了与并发相关的问题。谷歌搜索后我做了所有的可能性,但仍然无法解决我的问题。我创建了库存服务,它使用实体框架从 SQL Server 表中获取数据,如ItemHeadMasterItemMaster 等。

我在自定义用户搜索控件中引用了此 WCF 以进行搜索。当 2 个并发用户点击放置在 ASP.Net 页面上的搜索控件时,一切运行良好。

我的代码如下所示:

namespace HIS.STORESERVICES
{
[ServiceBehavior(ConcurrencyMode=ConcurrencyMode.Multiple)]
    public class StoreMasterData : IStoreMasterData
    {
 public string GetAllItemHead(string strHospitalId)
        {
            using (DAL.ItemHeadMaster objItemHeadMasterDAL = new DAL.ItemHeadMaster())
            {
                List<STORE.MODEL.ItemHeadMaster> objItemHeamMasterList = new List<STORE.MODEL.ItemHeadMaster>();
                objItemHeamMasterList = objItemHeadMasterDAL.GetAllItemHead(strHospitalId);
                XmlSerializer Xml_Serializer = new XmlSerializer(objItemHeamMasterList.GetType());
                StringWriter Writer = new StringWriter();
                Xml_Serializer.Serialize(Writer, objItemHeamMasterList);
                return Writer.ToString();
            }
        }
}

我在谷歌搜索后做了以下操作:

  1. 在配置中添加但没有效果

    <system.net>
        <connectionManagement>
            <add address="*" maxconnection="100" />
        </connectionManagement>
    </system.net>`
    
  2. 在配置中添加但没有效果反而变得更慢..

    <behaviors>
        <serviceBehaviors>
           <behavior>
              <serviceMetadata httpGetEnabled="True" />
              <serviceThrottling maxConcurrentCalls="32" 
                                 maxConcurrentInstances="2147483647" 
                                 maxConcurrentSessions="20"/>
    

请帮忙

【问题讨论】:

  • 您遇到了什么问题?性能或运行时错误?
  • 性能问题,页面几乎挂起。
  • 您到底为什么要手动 XML 序列化您的数据? WCF 会自动为您执行此操作。所以基本上你首先是 XML 序列化它,然后 WCF 再做一次......只需返回一个 List&lt;Something&gt; 并让 WCF 完成工作!
  • marc_s,感谢您的快速回复,我正在从代码中删除这些 xml 序列化,并将再次检查性能。
  • 感谢 marc_s,在删除手动序列化后它执行得很快,但现在开始出现新问题,当我第一次调用该服务时,当我从客户端访问时它工作正常......但后来在 2 或 3 次点击后,它给了我超时异常请建议

标签: wcf


【解决方案1】:

在 WCF 之前,要为同一主机、同一 LAN 或 Internet 中的进程之间的跨进程通信构建服务,您必须为目标环境和特定协议手工制作传输层和数据序列化。

使用 WCF,您只需专注于创建数据模型(由属性修饰后的 DataContracts)和操作模型(OperationContracts),.NET CLR 将在运行时“创建”大部分(如果不是全部)所需的传输层和数据序列化时间,根据您定义的配置或目标环境中的系统管理。

代码中的缺陷:

  1. WCF 通常使用 DataContractSerializer,而不是 Xmlserializer 来序列化事物,您不需要显式调用它,因为运行时会这样做。
  2. 对于大多数应用程序,您不需要明确地使用 ServiceBehaviorAttribute。在使用那些不适合初学者的优势配置之前,您必须深入了解 WCF。而且我很少使用它们。

您的服务接口函数应该轻松地返回复杂类型而不是序列化文本。在 99.9% 的情况下,如果 WCF 程序中有显式的序列化代码,即使不是完全错误,整个设计也是非常肮脏的。

创建 Hello World WCF 项目的教程有很多,VS 在创建新的 WCF 应用程序时为您提供了一个。熟悉Hello World后,可以看看http://www.codeproject.com/Articles/627240/WCF-for-the-Real-World-Not-Hello-World

顺便说一句,WCF 序列化速度很快,查看http://webandlife.blogspot.com.au/2014/05/performances-of-deep-cloning-and.html

【讨论】:

  • 感谢安迪,现在执行速度很快,但在 4-5 次并行命中后它开始给出超时错误“请求通道在 00:00:59.9990000 之后等待回复时超时。增加传递给的超时值调用 Request 或增加 Binding 上的 SendTimeout 值。分配给此操作的时间可能是较长超时的一部分。"
  • 我正在使用 wsHTTPBinding
  • 完成!!我修复了超时问题!谢谢
  • 您是否删除了 [ServiceBehavior(ConcurrencyMode=ConcurrencyMode.Multiple)]?你应该,因为默认情况下行为是多线程的。命中性能问题很可能与调用堆栈的性能有关,例如数据访问层,与 WCF 无关。您可以编写一个单独的线程测试来查看其他层或层的并发性能。
  • 我去掉了[ServiceBehavior(ConcurrencyMode=ConcurrencyMode.Multiple),去掉了手动xml序列化,但是差别不大。你的正确命中问题可能与数据库调用有关,我应该添加带有 SQLCacheDependency 的缓存以减少数据库命中吗??
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-15
  • 1970-01-01
  • 2013-07-18
  • 2021-07-10
  • 1970-01-01
  • 2011-04-19
相关资源
最近更新 更多