Служба WCF C # без IIS, WSDL не работает правильно - PullRequest
0 голосов
/ 04 июля 2019

Мне нужно создать приложение WCF Soap без IIS, но я только начинающий.

Я могу вызвать метод "Addiere" в моем браузере, но я хочу увидеть список методов в WSDL.

Program.cs:

class Program
{
    private static ServiceHost _wcfServiceHost = null;

    static void Main(string[] args)
    {
        _wcfServiceHost = new ServiceHost(typeof(WcfTransferservice.Service1), new Uri("http://localhost:8000"));
        _wcfServiceHost.AddServiceEndpoint(typeof(WcfTransferservice.IService1), new BasicHttpBinding(), "Soap");
        ServiceEndpoint endpoint = _wcfServiceHost.AddServiceEndpoint(typeof(WcfTransferservice.IService1), new WebHttpBinding(), "Web");
        endpoint.Behaviors.Add(new WebHttpBehavior());

        try
        {
            _wcfServiceHost.Open();

            Console.WriteLine("");
            Console.WriteLine("This can also be accomplished by navigating to");
            Console.WriteLine("http://localhost:8000/Web/EchoWithGet?s=Hello, world!");
            Console.WriteLine("in a web browser while this sample is running.");

            Console.WriteLine("");

            Console.WriteLine("Press [Enter] to terminate");
            Console.ReadLine();
            _wcfServiceHost.Close();
        }
        catch (CommunicationException cex)
        {
            Console.WriteLine("An exception occurred: {0}", cex.Message);
            _wcfServiceHost.Abort();
            Console.ReadLine();
        }
    }
}

IService1.cs:

 // HINWEIS: Mit dem Befehl "Umbenennen" im Menü "Umgestalten" können Sie den Schnittstellennamen "IService1" sowohl im Code als auch in der Konfigurationsdatei ändern.
[ServiceContract]
public interface IService1
{
    [OperationContract]
    [WebGet]
    int Addiere(int a, int b);

    [OperationContract]
    [WebGet]
    int Multipliziere(int a, int b);
}

Web.config:

<?xml version="1.0" encoding="utf-8"?>
<configuration>

  <appSettings>
    <add key="aspnet:UseTaskFriendlySynchronizationContext" value="true" />
  </appSettings>
  <system.web>
    <compilation debug="true" targetFramework="4.5" />
    <httpRuntime targetFramework="4.5"/>
  </system.web>
  <system.serviceModel>
    <behaviors>
      <serviceBehaviors>
        <behavior>
          <!-- Legen Sie die Werte unten vor der Bereitstellung auf "false" fest, um die Veröffentlichung von Metadateninformationen zu vermeiden. -->
          <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true"/>
          <!-- Damit in Fehlern Ausnahmedetails zum Debuggen angezeigt werden, legen Sie den Wert unten auf "true" fest. Legen Sie ihn vor der Bereitstellung auf "false" fest, um die Veröffentlichung von Ausnahmeinformationen zu vermeiden. -->
          <serviceDebug includeExceptionDetailInFaults="false"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <protocolMapping>
        <add binding="basicHttpsBinding" scheme="https" />
    </protocolMapping>    
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" />
  </system.serviceModel>
  <system.webServer>
    <modules runAllManagedModulesForAllRequests="true"/>
    <!--
        Um das Stammverzeichnis der Webanwendung beim Debuggen auszuwählen, legen Sie den Wert unten auf "true" fest.
        Legen Sie ihn vor der Bereitstellung auf "false" fest, um die Veröffentlichung von Informationen über den Webanwendungsordner zu vermeiden.
      -->
    <directoryBrowse enabled="true"/>
  </system.webServer>

</configuration>

Я могу назвать метод addiere следующим образом:

http://localhost:8000/Web/addiere?a=4&b=8

Но как я могу вызвать WSDL, чтобы показать все методы?

1 Ответ

0 голосов
/ 05 июля 2019

Нам нужно добавить поведение метаданных службы к узлу службы, см. Следующий код:

Uri uri = new Uri("http://localhost:9900");
            WebHttpBinding binding = new WebHttpBinding();
           ServiceHost sh=new ServiceHost(typeof(MyService),uri);
            ServiceEndpoint se = sh.AddServiceEndpoint(typeof(IService), binding, "");
            se.EndpointBehaviors.Add(new WebHttpBehavior());
            ServiceMetadataBehavior smb;
            smb = sh.Description.Behaviors.Find<ServiceMetadataBehavior>();
            if (smb==null)
            {
                smb = new ServiceMetadataBehavior()
                {
                    HttpGetEnabled = true
                };
                sh.Description.Behaviors.Add(smb);
            }
            //Add MEX service endpoint to make the call from the third party possible.
            Binding mexbinding = MetadataExchangeBindings.CreateMexHttpBinding();
            sh.AddServiceEndpoint(typeof(IMetadataExchange), mexbinding, "mex");
            sh.Open();
            Console.WriteLine("service is ready");
            Console.ReadLine();
            sh.Close();

Если мы хотим вызвать службу, добавив ссылку на службу, нам нужно добавить конечную точку MEX.,На самом деле WSDL доступен, когда добавлено поведение метаданных Сервиса.URL по умолчанию:

http://localhost:9900/?wsdl

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

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