我想了解有关设置WCF配置的一些基本指导。 这是我对WCF的第一次认真努力(以及第一篇文章 计算器)。
我有一个我参考的WCF类库(APILibrary) 我的网络项目。在wcf库中,我目前有两个 服务 - IAuthService和ITradeService。
沿着这些方向,我有三个问题:
1)我的问题(以及这篇文章的原始原因)是 编译我的应用程序我可以调用TradeServiceCient但不能 我的网络应用程序中的AuthServiceClient。后者不会出现在intellisense中。 我觉得这与他们分享的事实有关 同一个端口(只包括一个端点),但很明显 不清楚。
2)我试图同时暴露两个服务端点(并且, 我开发和测试的时候可能还有一些。当我搬到舞台上 和托管,每个端点将有自己的地址。在那之前,怎么做 我这样做(我觉得这与我上面的问题有关)?
3)我在很多帖子中都注意到人们有“客户”的例子 和“server”“system.serviceModel”代码。是这些独特的文件或标签 在我的WCF库中的App.config文件中?每个人在做什么? 目前,我想我只有服务器端?
以下是我目前在App.config文件中的内容(在我的WCF库中):
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.web>
<compilation debug="true" />
</system.web>
<!-- When deploying the service library project, the content of the config file must be added to the host's
app.config file. System.Configuration does not support config files for libraries. -->
<system.serviceModel>
<client />
<services>
<service behaviorConfiguration="ApiLibrary.ApiBehavior" name="SpoonSys.Api.Trade.TradeService">
<endpoint address="" binding="wsHttpBinding" contract="SpoonSys.Api.Trade.ITradeService">
<identity>
<dns value="localhost:8731" />
</identity>
</endpoint>
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
<host>
<baseAddresses>
<add baseAddress="http://localhost:8731/Design_Time_Addresses/ApiLibrary/Trade/" />
</baseAddresses>
</host>
</service>
<service behaviorConfiguration="ApiLibrary.ApiBehavior" name="SpoonSys.Api.Authentication.AuthService">
<endpoint address="" binding="wsHttpBinding" contract="SpoonSys.Api.Authentication.IAuthService">
<identity>
<dns value="localhost:8731" />
</identity>
</endpoint>
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
<host>
<baseAddresses>
<add baseAddress="http://localhost:8731/Design_Time_Addresses/ApiLibrary/Authentication/" />
</baseAddresses>
</host>
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior name="ApiLibrary.ApiBehavior">
<!-- To avoid disclosing metadata information,
set the value below to false and remove the metadata endpoint above before deployment -->
<serviceMetadata httpGetEnabled="True"/>
<!-- To receive exception details in faults for debugging purposes,
set the value below to true. Set to false before deployment
to avoid disclosing exception information -->
<serviceDebug includeExceptionDetailInFaults="True" />
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>
</configuration>
我的配置是ASP.NET / Framework 3.5 / VS 2008 / C#
答案 0 :(得分:4)
是的,在你的情况下,你只是在处理服务器端 - 所以你的配置看起来很不错,实际上。
我在配置中唯一要改变的是“baseAddress”和实际服务地址之间的分割。您当前在基地址中定义了完整的完整地址 - 这有点违背了基址的用途。我会像这样分开它:
<service name="SpoonSys.Api.Services"
behaviorConfiguration="ApiLibrary.ApiBehavior" >
<host>
<baseAddresses>
<add baseAddress="http://localhost:8731/Design_Time_Addresses/ApiLibrary/" />
</baseAddresses>
</host>
<endpoint
address="Trade"
binding="wsHttpBinding"
contract="SpoonSys.Api.Trade.ITradeService">
<identity>
<dns value="localhost:8731" />
</identity>
</endpoint>
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
</service>
这样,您基本上可以将两个端点折叠为一个 - 基地址只定义 - 所有其他地址的公共 base - 而端点定义完整地址的详细信息:< / p>
<service name="SpoonSys.Api.Services"
behaviorConfiguration="ApiLibrary.ApiBehavior" >
<host>
<baseAddresses>
<add baseAddress="http://localhost:8731/Design_Time_Addresses/ApiLibrary/" />
</baseAddresses>
</host>
<endpoint
address="Trade"
binding="wsHttpBinding"
contract="SpoonSys.Api.Trade.ITradeService">
<identity>
<dns value="localhost:8731" />
</identity>
</endpoint>
<endpoint
address="Authentication"
binding="wsHttpBinding"
contract="SpoonSys.Api.Authentication.IAuthService">
<identity>
<dns value="localhost:8731" />
</identity>
</endpoint>
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
</service>
如果您有一个服务类“SpoonSys.Api.Services”来实现这两个服务合同,那么这是有效的 - 这些服务合同完全没问题,而且非常有用。
如果您必须有两个单独的服务类,每个都实现一个接口,那么您将无法像这样折叠您的配置 - 那么您将必须使用原始中两个单独服务类的完整配置帖子(这对我来说似乎很好)。
另一个问题是为什么你只能在intellisense中看到一个端点 - 你是否为两个端点创建了客户端代理?由于它是两个单独的合同,因此您需要两个单独的客户端代理。您是如何创建客户端端点的?你也可以发布客户端配置吗?
马克
答案 1 :(得分:0)
我尝试根据你的建议缩短基地址。然后我在那里得到一个错误 一个服务会启动,但不会启动另一个服务。我被告知元数据端点已被使用。然后我尝试将我的命名空间从SpoonSys.ApiLibrary.Authentication和SpoonSys.ApiLibrary.Trade更改为SpoonSys.ApiLibary 对于所有类文件。仍然 - 同样的错误。当我改回原来的服务器配置时,它编译了。然而,intellisense只提供一种服务,而不是另一种服务。
我不确定您对我的客户端配置文件的意思。我没有在我的客户端应用程序项目中对WCF做过任何特别的事情(除了将WCF类库作为Web服务引用输入)。也许这就是我错的地方?你能告诉我更多吗?
我在WCF编辑器中注意到每个端点都有一个Client.dll,并发布了以下内容:
ENDPOINT:本地主机:8731 / Design_Time_Addresses /验证/ MEX
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<system.serviceModel>
<bindings>
<wsHttpBinding>
<binding name="WSHttpBinding_ITradeService" closeTimeout="00:01:00"
openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
bypassProxyOnLocal="false" transactionFlow="false" hostNameComparisonMode="StrongWildcard"
maxBufferPoolSize="524288" maxReceivedMessageSize="65536"
messageEncoding="Text" textEncoding="utf-8" useDefaultWebProxy="true"
allowCookies="false">
<readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
maxBytesPerRead="4096" maxNameTableCharCount="16384" />
<reliableSession ordered="true" inactivityTimeout="00:10:00"
enabled="false" />
<security mode="Message">
<transport clientCredentialType="Windows" proxyCredentialType="None"
realm="" />
<message clientCredentialType="Windows" negotiateServiceCredential="true"
algorithmSuite="Default" establishSecurityContext="true" />
</security>
</binding>
</wsHttpBinding>
</bindings>
<client>
<endpoint address="localhost:8731/Design_Time_Addresses/Trade/"
binding="wsHttpBinding" bindingConfiguration="WSHttpBinding_ITradeService"
contract="ITradeService" name="WSHttpBinding_ITradeService">
<identity>
<dns value="localhost:8731" />
</identity>
</endpoint>
</client>
</system.serviceModel>
</configuration>
ENDPOINT:http://localhost:8731/Design_Time_Addresses/Trade/mex
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<system.serviceModel>
<bindings>
<wsHttpBinding>
<binding name="WSHttpBinding_IAuthService" closeTimeout="00:01:00"
openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
bypassProxyOnLocal="false" transactionFlow="false" hostNameComparisonMode="StrongWildcard"
maxBufferPoolSize="524288" maxReceivedMessageSize="65536"
messageEncoding="Text" textEncoding="utf-8" useDefaultWebProxy="true"
allowCookies="false">
<readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
maxBytesPerRead="4096" maxNameTableCharCount="16384" />
<reliableSession ordered="true" inactivityTimeout="00:10:00"
enabled="false" />
<security mode="Message">
<transport clientCredentialType="Windows" proxyCredentialType="None"
realm="" />
<message clientCredentialType="Windows" negotiateServiceCredential="true"
algorithmSuite="Default" establishSecurityContext="true" />
</security>
</binding>
</wsHttpBinding>
</bindings>
<client>
<endpoint address="localhost:8731/Design_Time_Addresses/Authentication/"
binding="wsHttp binding" bindingConfiguration="WSHttpBinding_IAuthService"
contract="IAuthService" name="WSHttpBinding_IAuthService">
<identity>
<dns value="localhost:8731" />
</identity>
</endpoint>
</client>
</system.serviceModel>
</configuration>
最后,这是我的APP.CONFIG AGAIN:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.web>
<compilation debug="true" />
</system.web>
<!-- When deploying the service library project, the content of the config file must be added to the host's
app.config file. System.Configuration does not support config files for libraries. -->
<system.serviceModel>
<services>
<service behaviorConfiguration="ApiLibrary.ApiBehavior"
name="SpoonSys.ApiLibrary.Trade.TradeService">
<endpoint address="" binding="wsHttpBinding" contract="SpoonSys.Api.Trade.ITradeService">
<identity>
<dns value="localhost:8731" />
</identity>
</endpoint>
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
<host>
<baseAddresses>
<add baseAddress="http://localhost:8731/Design_Time_Addresses/Trade/" />
</baseAddresses>
</host>
</service>
<service behaviorConfiguration="ApiLibrary.ApiBehavior"
name="SpoonSys.Api.Authentication.AuthService">
<endpoint address="" binding="wsHttpBinding" contract="SpoonSys.ApiLibrary.Authentication.IAuthService">
<identity>
<dns value="localhost:8731" />
</identity>
</endpoint>
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
<host>
<baseAddresses>
<add baseAddress="localhost:8731/Design_Time_Addresses/Authentication/" />
</baseAddresses>
</host>
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior name="ApiLibrary.ApiBehavior">
<!-- To avoid disclosing metadata information,
set the value below to false and remove the metadata endpoint above before deployment -->
<serviceMetadata httpGetEnabled="True"/>
<!-- To receive exception details in faults for debugging purposes,
set the value below to true. Set to false before deployment
to avoid disclosing exception information -->
<serviceDebug includeExceptionDetailInFaults="True" />
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>
</configuration>
PS - 当我尝试提交我的回复时,我得到“新用户最多只能发布一个超链接”,我在帖子中取出了所有“http://”引用。它不是代码错误。