尝试通过浏览器
访问我的服务时,我收到“端点未找到”http://localhost:10093/Services/Service1.svc
我在尝试从wcftestclient访问同一地址时出现“错误:无法从http://localhost:10093/Services/Service1.svc获取元数据”。
如果我在服务实现中放置一个断点,它会被命中,所以我假设svc文件设置正确:
<%@ ServiceHost Language="C#" Debug="true"
Service="MyApp.Core.Service.Service.MyAppService,MyApp.Core.Service"
Factory="CommonServiceFactory.WebServiceHostFactory,CommonServiceFactory" %>
这是我的配置:
<system.serviceModel>
<services>
<service name="MyApp.Core.Service.Service.MyAppService,MyApp.Core.Service"
behaviorConfiguration="MainServiceBehavior">
<endpoint name="newEndpoing"
binding="basicHttpBinding" bindingConfiguration=""
contract="MyApp.Core.Service.IMyAppService" />
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior name="MainServiceBehavior">
<serviceMetadata httpGetEnabled="True"/>
<serviceDebug includeExceptionDetailInFaults="False" />
</behavior>
</serviceBehaviors>
</behaviors>
<serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
</system.serviceModel>
答案 0 :(得分:5)
所以你有一个* .svc文件来托管你的服务。您可以右键单击该文件上的Visual Studio并说“在浏览器中显示”吗?你在那里得到任何东西,或者它立即抛出错误?
下一步:您的服务端点没有address=""
属性,我认为这是必须的 - 尝试添加(即使您没有在其中指定地址)。
如果您在IIS中托管,您的服务地址由SVC文件所在的虚拟目录和SVC文件本身定义 - 您可能无法定义特定端口或任何内容(IIS将处理该)。
所以尝试连接到
http://localhost/Services/Service1.svc
这有用吗?
更新:再次阅读您的帖子,您正在为服务指定一个特殊工厂 - WebServiceHostFactory
。这是.NET提供的默认WebServiceHostFactory
,还是你自己构建的?
重点是:.NET WebServiceHostFactory
将使用webHttpBinding
用于RESTful WCF服务 - 这对于指定basicHttpBinding
的端点不起作用,REST服务也不会元数据....
更新#2:尝试在SVC文件和配置文件中仅使用服务的完全限定类名,但没有程序集规范。
所以改变这个:
Service="MyApp.Core.Service.Service.MyAppService,MyApp.Core.Service"
到此:
Service="MyApp.Core.Service.Service.MyAppService"
SVC文件:
<%@ ServiceHost Language="C#" Debug="true"
Service="MyApp.Core.Service.Service.MyAppService" %>
配置文件:
<services>
<service name="MyApp.Core.Service.Service.MyAppService"
behaviorConfiguration="MainServiceBehavior">
<endpoint name="newEndpoing"
binding="basicHttpBinding" bindingConfiguration=""
contract="MyApp.Core.Service.IMyAppService" />
</service>
</services>
答案 1 :(得分:4)
在解决方案资源管理器中,使用“查看标记”打开.svc
,确保您有以下内容:
... ServiceHost Language="C#" Debug="true"
Service="Yourservice.yourservice" CodeBehind="yourservice.svc.cs" %>
Yourservice
是您的命名空间,而yourservice
是您创建的.svc
的名称。
答案 2 :(得分:4)
当我把它放在浏览器窗口中时,我得到了相同的结果(没有找到端点)
http://c143253-w7a:2221/ws/myService.svc
然后当我将整个url放到方法中时,它运行正常。喜欢这个
http://c143253-w7a:2221/ws/myService.svc/HelloWorld?theInput=pds
在我的.svc文件中,我正在使用此
Factory="System.ServiceModel.Activation.WebServiceHostFactory"
我认为工厂在需要之前不会启动端点。这就是为什么我们在浏览器中找不到Endpoint(?)。
以下是接口代码中方法签名的外观。
using System.ServiceModel.Web;
[WebGet(UriTemplate = "HelloWorld?theInput={theInput}")]
[OperationContract]
string HelloWorld(string theInput);
我在webconfig中没有放任何东西。那里有一些东西,但我认为VS,添加WCF服务模板。它看起来像这样:
<system.serviceModel>
<behaviors>
<serviceBehaviors>
<behavior name="">
<serviceMetadata httpGetEnabled="true" />
<serviceDebug includeExceptionDetailInFaults="false" />
</behavior>
</serviceBehaviors>
</behaviors>
<serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
</system.serviceModel>
答案 3 :(得分:0)
您的错误消息是“无法获取元数据”,并且您没有定义MetadataExchange端点。你确实有httpGetEnabled =“True”,这也是必需的。
尝试定义MEX端点,详细信息如何查看:http://bloggingabout.net/blogs/dennis/archive/2006/11/09/WCF-Part-4-3A00-Make-your-service-visible-through-metadata.aspx
答案 4 :(得分:0)
我的WCF服务的web.config与您的非常相似。你必须像Shiraz所说的那样添加MEX端点。我添加了一个行为配置,允许任何消息大小通过WCF。尝试使用这些设置,如果它可以帮助您(不要忘记更改合同设置):
<system.serviceModel>
<diagnostics>
<messageLogging logMalformedMessages="true" logMessagesAtTransportLevel="true" />
</diagnostics>
<bindings>
<basicHttpBinding>
<binding name="BasicHttpBinding_IService" closeTimeout="00:01:00" openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00" allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard" maxBufferSize="524288000" maxBufferPoolSize="524288000" maxReceivedMessageSize="524288000" messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered" useDefaultWebProxy="true">
<readerQuotas maxDepth="500000000" maxStringContentLength="500000000" maxArrayLength="500000000" maxBytesPerRead="500000000" maxNameTableCharCount="500000000" />
<security mode="None">
<transport clientCredentialType="None" proxyCredentialType="None" realm="">
<extendedProtectionPolicy policyEnforcement="Never"/>
</transport>
<message clientCredentialType="UserName" algorithmSuite="Default"/>
</security>
</binding>
</basicHttpBinding>
</bindings>
<behaviors>
<serviceBehaviors>
<behavior name="serviceBehavior">
<dataContractSerializer maxItemsInObjectGraph="6553600" />
<serviceMetadata httpGetEnabled="true" />
<serviceDebug includeExceptionDetailInFaults="true" />
</behavior>
</serviceBehaviors>
</behaviors>
<services>
<service behaviorConfiguration="serviceBehavior" name="RC.Svc.Web.TPF.Service">
<endpoint
address=""
binding="basicHttpBinding"
bindingConfiguration="BasicHttpBinding_IService"
contract="RC.Svc.Web.TPF.IService" />
<endpoint contract="IMetadataExchange" binding="mexHttpBinding" address="mex" />
</service>
</services>
<serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
<client />