2011-09-09 16 views
0

我们希望我们的Web应用程序与我们的WCF Web服务分离。我们不希望网络应用程序知道它是否触及任何WCF服务。因此我们不希望在Web应用程序集中定义任何WCF Web服务引用。ASP.NET MVC WCF服务引用/代理是否必须存在于Web应用程序集合中?

我想要做的是创建一个单独的WCF包装程序集,其中将包含WCF服务参考和app.config文件中的必要配置。 WCF包装中的方法将从Web应用程序调用。当我在Web App程序集中创建WCF服务引用和配置时,它工作正常。当我将WCF Web引用和配置文件放入WCF包装程序集时,它抱怨找不到端点。它看起来不像是在包装程序集中找到app.config文件。

因此,在总结我想要的结构如下:

Web app --> WCF wrapper (with WCF service references and config) --> BAL layer --> etc 

配置文件(Web.config如果Web应用程序组件的app.config如果WCF包装程序集):

<system.serviceModel> 
    <bindings> 
     <basicHttpBinding> 
     <binding name="BasicHttpBinding_IEmailValidator" closeTimeout="00:01:00" 
     openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00" 
     allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard" 
     maxBufferSize="65536" maxBufferPoolSize="524288" maxReceivedMessageSize="65536" 
     messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered" 
     useDefaultWebProxy="true"> 
      <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384" 
      maxBytesPerRead="4096" maxNameTableCharCount="16384" /> 
      <security mode="None"> 
      <transport clientCredentialType="None" proxyCredentialType="None" 
      realm="" /> 
      <message clientCredentialType="UserName" algorithmSuite="Default" /> 
      </security> 
     </binding> 
     </basicHttpBinding> 
    </bindings> 
    <client> 
     <endpoint address="http://localhost:8080/" binding="basicHttpBinding" 
     bindingConfiguration="BasicHttpBinding_IEmailValidator" contract="EmailProxy.IEmailValidator" 
     name="BasicHttpBinding_IEmailValidator" /> 
    </client> 
    </system.serviceModel> 

我是否必须在Web应用程序组合中创建WCF服务引用,还是可以在WCF包装中执行?

错误消息:

找不到默认终结点元素引用合同 'EmailProxy.IEmailValidator' 在ServiceModel客户端配置 部分。这可能是因为没有为您的应用程序找到配置文件 ,或者因为在客户端元素中找不到与此 合同匹配的端点元素。

回答

4

这又回到了老的事实,那就是.NET配置系统不支持配置文件的类库 - 它预计,一个类库的配置是在主机应用程序使用类库 - 例如在你的web应用程序中。

这实际上不是一个WCF问题 - 它是.NET团队做出的一个通用的.NET设计决策。类库可能在解决方案中有app.config文件,甚至可能编译为myclasslibrary.dll.config - 但该文件是未由.NET配置系统检查和解析

因此,在您的情况下,您的Web应用程序无法找到配置,因此无法配置任何端点,这就是它失败的原因。

你基本上有三个主要选项:

  • 生活在这种限制,把你的WCF配置到Web应用程序的web.config
  • 找到配置你的WCF服务库,例如一个替代方法从其他来源,如数据库
  • 投入大量的努力使你的WCF服务库实际考虑,拿起你的类库的单独的配置文件
+0

谢谢。这可能是一个愚蠢的问题,WCF代理服务引用是否也必须在主机应用程序中创建? – Elim99

+0

@ Elim99:“主机应用程序”是什么意思? WCF始终是两部分 - **服务器**(实现服务方法并托管在例如IIS或Windows服务中)以及一个或多个**客户端**,它们使用客户端代理与服务器。因此,只有客户端需要客户端代理,显然... –

+0

我的意思是我有一个宿主应用程序程序集,在另一个程序集中调用WCF包装类,然后调用服务方法。我的问题是:代理是否只存在于WCF包装程序集中?目前,我必须在两个程序集中都设置代理,即使“主机应用程序程序集”不直接调用服务方法。 – Elim99

0

您可以通过

加载自定义配置文件
ExeConfigurationFileMap configMap = new ExeConfigurationFileMap(); 
configMap.ExeConfigFilename = @"c:\myapp\wcfsettings.config.anything"; 
Configuration config = ConfigurationManager.OpenMappedExeConfiguration(configMap, ConfigurationUserLevel.None); 
相关问题