我在这里遇到一个非常奇怪的问题。为简单起见,我创建了一个项目,其唯一目的是在更大的应用程序框架之外测试问题,但仍然遇到Visual Studio 2010中的WCF中的错误或与我的WCF新手技能集相关的错误:)
问题在于:
我创建了一个在名为“SimpleMethod”的MVC3项目中运行的WCF端点。该方法在应用程序根目录下的.svc文件中运行,并返回一个bool。
使用“WCF服务配置编辑器”我已将端点添加到我的Web.Config以及一个名为“LargeImageBinding”的文件。
这是服务:
[OperationContract]
public bool SimpleMethod()
{
return true;
}
Config Tool生成的Web.Config:
<system.serviceModel>
<bindings>
<wsHttpBinding>
<binding name="LargeImageBinding" closeTimeout="00:10:00" />
</wsHttpBinding>
</bindings>
<services>
<service name="WCFEndpoints.ServiceTestOne">
<endpoint address="/ServiceTestOne.svc" binding="wsHttpBinding"
bindingConfiguration="LargeImageBinding" contract="WCFEndpoints.IServiceTestOne" />
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior name="">
<serviceMetadata httpGetEnabled="true" />
<serviceDebug includeExceptionDetailInFaults="false" />
</behavior>
</serviceBehaviors>
</behaviors>
<serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
服务呈现正常,您可以在导航到http://localhost:57364/ServiceTestOne.svc时看到端点 - 现在,当我创建一个单独的项目来使用服务时会出现问题。我将一个服务引用添加到上面项目的运行实例中,将其指向:http://localhost:57364/ServiceTestOne.svc
这是奇怪的部分。该服务自动生成就好了但在Web.Config中生成的端点如下所示:
<client>
<endpoint address="http://localhost:57364/ServiceTestOne.svc/ServiceTestOne.svc"
binding="wsHttpBinding" bindingConfiguration="WSHttpBinding_IServiceTestOne"
contract="ServiceTestOne.IServiceTestOne" name="WSHttpBinding_IServiceTestOne">
正如您所看到的,它会两次列出地址的“ServiceTestOne.svc”部分!
当我调用该服务时,我收到以下错误:
远程服务器返回错误:(404)Not Found。
我尝试在上面的配置中删除端点地址末尾的额外“/ServiceTestOne.svc”,我得到了同样的错误。
现在,如果我回到WCF应用程序并删除Web.Config中的自定义端点和绑定引用(“services”和“bindings”标记中的所有内容),那么它的工作原理是什么呢?然后返回到使用者应用程序,更新对服务的引用并调用SimpleMethod().... BOOM的工作方式就像一个魅力,我将bool设置为true。
问题是,我需要进行自定义绑定配置,以便允许访问默认值之外的服务,而且据我所知,任何创建自定义绑定的尝试都会使端点运行正常,但是在进行实际的方法调用时失败。
任何人都可以看到我将它放在一起的任何缺陷吗?感谢您抽出宝贵的时间 - 我已经在这个圈子里跑了大约一个星期!
答案 0 :(得分:2)
在IIS中托管WCF服务时,使用以下格式形成服务的基本地址:{protocol}:// {host}:{port} / {applicationName} / {svcFileName}。这是您可以浏览以获取WCF帮助页面和/或元数据的地址(在默认配置中)。
要形成端点的实际地址(客户端需要使用的地址),使用以下格式:{serviceBaseAddress} / {endpointAddress}
比较上面的格式和您提供的示例配置解释了您在客户端地址中获取ServiceTestOne.svc两次的原因。
如果您希望服务的地址为http://localhost:57364/ServiceTestOne.svc,我建议您在端点配置中保留地址属性为空:
<endpoint address="" ... />