我有一个 WCF 网络服务,我正在我的本地机器上测试这让我头疼。
我的服务配置如下:
<system.serviceModel>
<services>
<service name="GHMDatroseIntegration.GHMDatroseWCFService.DatroseService"
behaviorConfiguration="DatroseServiceBehavior">
<endpoint
address="mex"
binding="basicHttpBinding"
contract="GHMDatroseIntegration.GHMDatroseWCFService.IDatroseService" />
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior name="DatroseServiceBehavior">
<serviceMetadata httpGetEnabled="true"/>
<serviceDebug includeExceptionDetailInFaults="true"/>
<dataContractSerializer maxItemsInObjectGraph="2147483647"/>
</behavior>
</serviceBehaviors>
</behaviors>
<serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
</system.serviceModel>
我的客户端配置如下:
<system.serviceModel>
<bindings>
<basicHttpBinding>
<binding name="BasicHttpBinding_IDatroseService"
closeTimeout="00:02:00" openTimeout="00:01:00"
receiveTimeout="00:10:00" sendTimeout="00:02:00"
allowCookies="false" bypassProxyOnLocal="false"
hostNameComparisonMode="StrongWildcard"
maxBufferSize="524288" maxBufferPoolSize="524288"
maxReceivedMessageSize="524288"
messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered"
useDefaultWebProxy="true">
<readerQuotas
maxDepth="32" maxStringContentLength="524288"
maxArrayLength="524288" maxBytesPerRead="524288"
maxNameTableCharCount="524288" />
<security mode="None">
<transport clientCredentialType="None" proxyCredentialType="None"
realm="" />
<message clientCredentialType="UserName" algorithmSuite="Default" />
</security>
</binding>
</basicHttpBinding>
</bindings>
<client>
<endpoint name="BasicHttpBinding_IDatroseService"
address="http://localhost/DatroseWCFService/DatroseService.svc"
behaviorConfiguration="DatroseServiceBehavior"
binding="basicHttpBinding"
bindingConfiguration="BasicHttpBinding_IDatroseService"
contract="DatroseWCFService.IDatroseService" />
</client>
<behaviors>
<endpointBehaviors>
<behavior name="DatroseServiceBehavior">
<dataContractSerializer maxItemsInObjectGraph="2147483647"/>
</behavior>
</endpointBehaviors>
</behaviors>
</system.serviceModel>
我收到的错误是:
There was no endpoint listening at http://localhost/DatroseWCFService/DatroseService.svc that could accept the message. This is often caused by an incorrect address or SOAP action. See InnerException, if present, for more details.
...然而,如果我浏览到该位置,我会看到服务屏幕,所以它似乎设置正确。
我确定这与我的端点配置有关,但我无法弄清楚它们应该是什么样子。在这里提供一些帮助将不胜感激。
更新 糟糕,我输入了错误的错误消息。现在已修复。
UPDATE 2 根据我认为这些回复中的建议,我已将我的服务器配置更改为:
<system.serviceModel>
<services>
<service name="GHMDatroseIntegration.GHMDatroseWCFService.DatroseService"
behaviorConfiguration="DatroseServiceBehavior">
<endpoint
address="/svc"
binding="basicHttpBinding"
contract="GHMDatroseIntegration.GHMDatroseWCFService.IDatroseService" />
<endpoint
address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior name="DatroseServiceBehavior">
<serviceMetadata httpGetEnabled="true"/>
<serviceDebug includeExceptionDetailInFaults="true"/>
<dataContractSerializer maxItemsInObjectGraph="2147483647"/>
</behavior>
</serviceBehaviors>
</behaviors>
<serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
</system.serviceModel>
我的客户端配置为:
<system.serviceModel>
<bindings>
<basicHttpBinding>
<binding name="BasicHttpBinding_IDatroseService"
closeTimeout="00:02:00" openTimeout="00:01:00"
receiveTimeout="00:10:00" sendTimeout="00:02:00"
allowCookies="false" bypassProxyOnLocal="false"
hostNameComparisonMode="StrongWildcard"
maxBufferSize="524288" maxBufferPoolSize="524288"
maxReceivedMessageSize="524288"
messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered"
useDefaultWebProxy="true">
<readerQuotas
maxDepth="32" maxStringContentLength="524288" maxArrayLength="524288"
maxBytesPerRead="524288" maxNameTableCharCount="524288" />
<security mode="None">
<transport clientCredentialType="None" proxyCredentialType="None"
realm="" />
<message clientCredentialType="UserName" algorithmSuite="Default" />
</security>
</binding>
</basicHttpBinding>
</bindings>
<client>
<endpoint name="BasicHttpBinding_IDatroseService"
address="http://localhost/DatroseWCFService/DatroseService.svc/svc"
behaviorConfiguration="DatroseServiceBehavior"
binding="basicHttpBinding"
bindingConfiguration="BasicHttpBinding_IDatroseService"
contract="DatroseWCFService.IDatroseService" />
</client>
<behaviors>
<endpointBehaviors>
<behavior name="DatroseServiceBehavior">
<dataContractSerializer maxItemsInObjectGraph="2147483647"/>
</behavior>
</endpointBehaviors>
</behaviors>
</system.serviceModel>
当我运行它时,我现在收到 400(错误请求)错误。我不确定这是向前迈出的一步还是后退一步。我是否创建了一个新问题,或者是否为下一个问题扫清了道路?
更新 3
根据 niao 的建议,我将服务器配置更改为:
<system.serviceModel>
<services>
<service name="GHMDatroseIntegration.GHMDatroseWCFService.DatroseService" behaviorConfiguration="DatroseServiceBehavior">
<endpoint contract="GHMDatroseIntegration.GHMDatroseWCFService.IDatroseService" binding="basicHttpBinding" address="http://localhost/DatroseWCFService/DatroseService.svc"/>
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior name="DatroseServiceBehavior">
<!-- 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"/>
<dataContractSerializer maxItemsInObjectGraph="2147483647"/>
</behavior>
</serviceBehaviors>
</behaviors>
<serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
</system.serviceModel>
...然而,当我浏览到这个地址时,却出现了蓝屏死机:
Server Error in '/DatroseWCFService' Application.
When 'system.serviceModel/serviceHostingEnvironment/multipleSiteBindingsEnabled' is set to true in configuration, the endpoints are required to specify a relative address. If you are specifying a relative listen URI on the endpoint, then the address can be absolute. To fix this problem, specify a relative uri for endpoint 'http://localhost/DatroseWCFService/DatroseService.svc'.
...因此,我尝试将其设为如下所示的相对路径:
<endpoint
address="localhost/DatroseWCFService/DatroseService.svc"
binding="basicHttpBinding"
contract="GHMDatroseIntegration.GHMDatroseWCFService.IDatroseService" />
...但是在发布之后,我收到了 404 错误。客户端端点配置如下:
<endpoint name="BasicHttpBinding_IDatroseService"
address="http://localhost/DatroseWCFService/DatroseService.svc"
behaviorConfiguration="DatroseServiceBehavior"
binding="basicHttpBinding"
bindingConfiguration="BasicHttpBinding_IDatroseService"
contract="DatroseWCFService.IDatroseService" />
更新 4 根据 marc_s 的建议,我从客户端删除了绑定(bind)配置,因此我的配置如下所示:
<system.serviceModel>
<client>
<endpoint address="http://localhost/DatroseWCFService/DatroseService.svc" behaviorConfiguration="DatroseServiceBehavior"
binding="basicHttpBinding"
contract="DatroseWCFService.IDatroseService" name="BasicHttpBinding_IDatroseService" />
</client>
<behaviors>
<endpointBehaviors>
<behavior name="DatroseServiceBehavior">
<dataContractSerializer maxItemsInObjectGraph="10000000"/>
</behavior>
</endpointBehaviors>
</behaviors>
</system.serviceModel>
我的服务器配置如下:
<system.serviceModel>
<services>
<service name="GHMDatroseIntegration.GHMDatroseWCFService.DatroseService" behaviorConfiguration="DatroseServiceBehavior">
<endpoint contract="GHMDatroseIntegration.GHMDatroseWCFService.IDatroseService" binding="basicHttpBinding" address=""/>
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior name="DatroseServiceBehavior">
<serviceMetadata httpGetEnabled="true"/>
<serviceDebug includeExceptionDetailInFaults="true" httpsHelpPageEnabled="true" httpHelpPageEnabled="true"/>
<dataContractSerializer maxItemsInObjectGraph="10000000"/>
</behavior>
</serviceBehaviors>
</behaviors>
<serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
</system.serviceModel>
我不再收到 404 错误。
但是,我确实得到了一个 400(ProtocolException,错误的请求),但没有关于它得到了什么或为什么它是错误的启发性信息。我希望我已经超越了端点问题,进入了一个全新的服务配置 hell 。
更新 5
根据请求,我的服务的“骨架”(我假设接口(interface)可以?):
[ServiceContract]
public interface IDatroseService
{
[OperationContract]
bool SubmitPayableTransaction(List<InvoiceItem> invoices);
[OperationContract]
Dictionary<string, bool> ValidateAccounts(List<string> accounts);
[OperationContract]
Dictionary<string, int> GetVendor1099Types(List<string> vendors);
[OperationContract]
Dictionary<string, string> GetPaymentTerms(List<string> vendors);
}
最佳答案
所以我假设您的服务托管在 IIS 中,对吗?
所以您的 *.svc
所在的虚拟目录基本上定义了您的服务地址 - 那么这个地址是否正确?
此外:您在服务端点上有“相对”地址 mex
<endpoint
address="mex"
(我认为这是一个非常糟糕的主意 - MEX 代表元数据交换,我不会将该地址用于常规服务端点!它只是违反了最少惊喜原则- 如果端点被调用 MEX
,我希望它成为元数据交换端点——而不是常规服务端点...)
无论如何 - 使用该常规地址,您的完整服务地址将变为:
http://yourserver/DatroseWCFService/DatroseService.svc/mex
如果您在该地址上调用您的服务会怎么样 - 您会得到响应吗??
<罢工>
更新:不确定您是如何尝试测试的。这是一个 SOAP 网络服务 - 您将在浏览器中看到该服务的“登陆页面”(“帮助”页面),但要测试该服务本身,您需要使用支持 SOAP 的测试工具(如 WCF Test Client 或SoapUI) - 您无法通过仅浏览其网址来测试 SOAP Web 服务。
罢工>
(好的,所以您通过从测试应用程序调用服务来测试它 - 这绝对有效!)
更新#2:因为您在 IIS 中托管它(对吗?),您的服务地址基本上由 *.svc 文件所在的虚拟目录定义。所以我的下一次尝试是:让那个地址成为您的服务地址。
将您的服务端配置更改为:
<service name="GHMDatroseIntegration.GHMDatroseWCFService.DatroseService"
behaviorConfiguration="DatroseServiceBehavior">
<endpoint
address="" <!-- define nothing here - just let the *.svc file determine your service address -->
binding="basicHttpBinding"
contract="GHMDatroseIntegration.GHMDatroseWCFService.IDatroseService" />
<endpoint
address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
</service>
和您的客户端配置:
<endpoint name="BasicHttpBinding_IDatroseService"
address="http://localhost/DatroseWCFService/DatroseService.svc"
behaviorConfiguration="DatroseServiceBehavior"
binding="basicHttpBinding"
bindingConfiguration="BasicHttpBinding_IDatroseService"
contract="DatroseWCFService.IDatroseService" />
这样行吗??
下一次尝试是使用没有 bindingConfiguration=
值的客户端配置 - 因为这也是你在服务器上所做的 - 绝对是没有 任何 修改的基本 basicHttpBinding
-有用吗??
关于c# - WCF 找不到端点配置问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9166103/