WCF Visual Studio 2017 локальная разработка - PullRequest
0 голосов
/ 20 марта 2020

27 марта 2020 г. ОБНОВЛЕНИЕ

Прошло 4 дня, и сейчас я обшил стены своего офиса. :)

БОЛЬШОЙ ВОПРОС

Это будет работать только локально, если я изменю следующие настройки Анонимная аутентификация = включена

Кто-нибудь знает, как обойти эту проблему с - IIS Express - Visual Studio 2017

Я вышел из рабочего кода и создал тест локально, и сейчас я застрял только в одной проблеме.

Аутентификация теперь моя БЛОКЕР

Мне нужно будет использовать настройки для развертывания, поскольку у меня нет никакого контроля над DEV | СИТ | UAT | PROD --- IAAS или PAAS - я могу только код CI и CD.

Я удалил все ---- Конфигурация Это не было в исходном коде

Мне нужно закомментировать код в файле

MultipleBindingServiceHost.cs

Localhost жалуется на 2 URL (я вернусь, как только исправлю все дыры в безопасности кода.

string rawUrl = ConfigurationManager.AppSettings["tsRawUrl"];
                ServiceEndpoint endpoint = AddServiceEndpoint(typeof(ITicketService), httpBinding, baseAddress, new Uri(rawUrl));
                endpoint.Behaviors.Add(new WebHttpBehavior());

#if (!DEBUG)
                string vanityUrl = ConfigurationManager.AppSettings["tsVanityUrl"];
                ServiceEndpoint endpoint2 = AddServiceEndpoint(typeof(ITicketService), httpBinding, baseAddress, new Uri(vanityUrl));
                endpoint2.Behaviors.Add(new WebHttpBehavior());
#endif


23 марта 2020 г.

Я пытался выяснить WCF и Разработка локальной машины в течение прошлой недели, и теперь я прихожу к stackoverflow для помощи сообществам.

Мне была поручена поддержка приложения, имеющего две службы WCF

Web.config appSettings Настройки следующие:

<appSettings>
    <add key="tsVanityUrl" value="http://localhost:1574/TicketService.svc" />
    <add key="tsRawUrl" value="http://localhost:1574/TicketService.svc" />
    <add key="fsVanityUrl" value="http://localhost:1574/FileService.svc" />
    <add key="fsRawUrl" value="http://localhost:1574/FileService.svc" />
</appSettings>

Web.config system.serviceModel

  <system.serviceModel>
    <!-- START RBD Additions for Local Development -->
    <serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
    <behaviors>
      <serviceBehaviors>
        <behavior name="TicketBehavior">
          <serviceMetadata httpGetEnabled="true" />
        </behavior>
        <behavior name="FileBehavior">
          <serviceMetadata httpGetEnabled="true" />
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <services>
      <service name="TicketSystem.TicketService" behaviorConfiguration="TicketBehavior"> 
        <endpoint address="/TicketService.svc"                  
                  binding="basicHttpBinding"
                  contract="TicketSystem.ITicketService"
                  />
      </service>
      <service name="TicketSystem.FileService" behaviorConfiguration="FileBehavior"> 
        <endpoint address="/FileService.svc"                  
                  binding="basicHttpBinding"
                  contract="TicketSystem.IFileService" 
                  />
      </service>
    </services>
    <!-- END RBD Additions for Local Development -->
  </system.serviceModel>

Я получаю следующую ошибку :

Невозможно добавить значение в коллекцию, поскольку коллекция уже Элемент того же типа: 'System.ServiceModel.Description.ServiceMetadataBehavior'. Эта коллекция поддерживает только один экземпляр каждого типа. Имя параметра: item

Это указывает на файл MultipleBindingServiceHost.cs

protected override void ApplyConfiguration()
        {
            base.ApplyConfiguration();

            ServiceMetadataBehavior mexBehavior = new ServiceMetadataBehavior();
            Description.Behaviors.Add(mexBehavior);

            WebHttpBinding httpBinding = new WebHttpBinding();                                 

            foreach (Uri baseAddress in BaseAddresses)
            {
                if (baseAddress.Scheme == Uri.UriSchemeHttp)
                {
                    httpBinding.Security.Mode = WebHttpSecurityMode.None;
                    mexBehavior.HttpGetEnabled = true;
                }
                else if (baseAddress.Scheme == Uri.UriSchemeHttps)
                {
                    httpBinding.Security.Mode = WebHttpSecurityMode.Transport;
                    httpBinding.Security.Transport.ClientCredentialType = HttpClientCredentialType.None;
                    mexBehavior.HttpsGetEnabled = true;
                }
                //ServiceEndpoint endpoint = AddServiceEndpoint(typeof(TicketSystem.ITicketService),
                //                        httpBinding,
                //                        baseAddress);
                //endpoint.Behaviors.Add(new WebHttpBehavior());

                //Fix for 404 Vanity URL Issue
                string rawUrl = ConfigurationManager.AppSettings["tsRawUrl"];
                ServiceEndpoint endpoint = AddServiceEndpoint(typeof(ITicketService), httpBinding, baseAddress, new Uri(rawUrl));
                endpoint.Behaviors.Add(new WebHttpBehavior());

                string vanityUrl = ConfigurationManager.AppSettings["tsVanityUrl"];
                ServiceEndpoint endpoint2 = AddServiceEndpoint(typeof(ITicketService), httpBinding, baseAddress, new Uri(vanityUrl));
                endpoint2.Behaviors.Add(new WebHttpBehavior());

                break;
            }
        }
    }

Я знаю, что я очень близок и, возможно, что-то упустил очень просто, но потратив на это несколько дней, я должен опубликовать в стеке поток, чтобы сервисы работали на моей локальной машине.

1 Ответ

0 голосов
/ 23 марта 2020

Проект приложения-службы WCF не поддерживает несколько сервисных контрактов на одном хосте сервиса. Один сервисный проект имеет один сервисный хост, нам нужно указать класс, реализованный сервисом, во время запуска хоста. Следовательно, невозможно разместить несколько сервисных контрактов на одном хосте. Мы могли бы создать несколько хостов в консольном / Windows сервисном приложении NT, чтобы поддерживать несколько сервисных контрактов.

using (ServiceHost sh = new ServiceHost(typeof(TestService)), sh2 = new ServiceHost(typeof(MyService1)))
{
    sh.Opened += delegate
    {
        Console.WriteLine("service is ready");
    };

    sh.Closed += delegate
    {
        Console.WriteLine("service is closed");
    };
    sh2.Opened += delegate
    {
        Console.WriteLine("service2 is ready...");
    };
    sh2.Closed += delegate
    {
        Console.WriteLine("Service is closed...");
    };
    sh.Open();
    sh2.Open();

    Console.ReadLine();
    sh.Close();
    sh2.Close();
}

Не стесняйтесь, дайте мне знать, если есть что-то, с чем я могу помочь.

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