在ASP.NET中托管时找不到端点

时间:2010-10-02 20:12:57

标签: asp.net wcf

尝试通过浏览器

访问我的服务时,我收到“端点未找到”
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>

5 个答案:

答案 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 />