Конечная точка не найдена при хостинге в ASP.NET - PullRequest
5 голосов
/ 03 октября 2010

Я получаю «Конечная точка не найдена» при попытке доступа к моей службе через браузер на

http://localhost:10093/Services/Service1.svc

Я получаю "Ошибка: невозможно получить метаданные из http://localhost:10093/Services/Service1.svc" при попытке доступа к тому же адресу из wcftestclient.

Если я установлю точку останова в реализации службы, она попадет, поэтому я предполагаю, что файл 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 ]

5 голосов
/ 03 октября 2010

Итак, у вас есть файл * .svc для размещения вашего сервиса.Можете ли вы щелкнуть правой кнопкой мыши в Visual Studio по этому файлу и сказать «Показать в браузере»?Получаете ли вы что-нибудь там, или оно сразу выдает ошибку ??

Далее: ваша конечная точка службы не имеет атрибута address="", который я считаю обязательным - попробуйте добавить это (даже если вы этого не делаетеукажите в нем адрес).

Если вы размещаете хостинг в IIS, адрес вашей службы определяется виртуальным каталогом, в котором находится ваш файл SVC, и самим файлом SVC - вы не сможете определитьопределенный порт или что-нибудь (IIS будет обрабатывать это).

Так что попробуйте подключиться к

http://localhost/Services/Service1.svc

Работает ли это случайно?

Обновление: чтение вашегопостите еще раз повнимательнее, вы указываете специальную фабрику для сервиса - WebServiceHostFactory.Это WebServiceHostFactory по умолчанию, предоставляемый .NET, или это что-то, что вы создали сами ??

Дело в том, что .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>
4 голосов
/ 08 марта 2012

У меня были те же результаты (конечная точка не найдена), когда я помещал это в окно браузера

http://c143253-w7a:2221/ws/myService.svc

Затем, когда я поместил весь URL в метод, он работал нормально. Как это

http://c143253-w7a:2221/ws/myService.svc/HelloWorld?theInput=pds

В моем файле .svc я использую этот

Factory="System.ServiceModel.Activation.WebServiceHostFactory"

Я думаю, что Фабрика не раскручивает конечную точку, пока она не понадобится. Вот почему мы не видим конечную точку в браузере (?).

Вот как выглядит сигнатура метода в коде интерфейса.

using System.ServiceModel.Web;

[WebGet(UriTemplate = "HelloWorld?theInput={theInput}")]
[OperationContract]
string HelloWorld(string theInput);

Я ничего не помещал в webconfig. Там есть кое-что, но я думаю, что оно появилось в шаблоне VS, Add WCF Service. Это выглядит так:

<system.serviceModel>
 <behaviors>
   <serviceBehaviors>
     <behavior name="">
       <serviceMetadata httpGetEnabled="true" />
       <serviceDebug includeExceptionDetailInFaults="false" />
     </behavior>
   </serviceBehaviors>
 </behaviors>
 <serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
</system.serviceModel>
4 голосов
/ 29 февраля 2012

В обозревателе решений откройте .svc, используя «просмотр разметки», убедитесь, что у вас есть что-то вроде:

... ServiceHost Language="C#" Debug="true" 
    Service="Yourservice.yourservice" CodeBehind="yourservice.svc.cs" %>

Где Yourservice - это ваше пространство имен, а yourservice - это имяваш .svc создан.

0 голосов
/ 06 октября 2010

мой web.config для моего сервиса WCF очень похож на ваш.Вы определенно должны добавить конечную точку 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 />

0 голосов
/ 05 октября 2010

Ваше сообщение об ошибке «Не удается получить метаданные», и у вас не определена конечная точка MetadataExchange.У вас есть httpGetEnabled = "True", что также является обязательным.

Попробуйте определить конечную точку MEX, чтобы узнать подробнее: http://bloggingabout.net/blogs/dennis/archive/2006/11/09/WCF-Part-4-3A00-Make-your-service-visible-through-metadata.aspx

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...