Как позвонить в службу IsOneWay WCF и как правильно закрыть клиента

Я очень новичок в WCF, и я настроил тестовый веб-сайт и сервис. Я пытаюсь сделать две вещи:

  1. Позвоните в сервис без блокировки пользователя
  2. Закройте клиент правильно

Я создал веб-сервис и присвоил ему атрибут isoneway. Мне удалось позвонить, не блокируя пользователя, но я беспокоюсь, что не закрываю клиента. Как я могу вызвать эту услугу, не блокируя пользователя, и все же правильно закрыть клиент? Должен ли я использовать асинхронный метод (TestServiceAsync)? Должен ли я использовать методы BeginXX, EndXX?

Клиент:

Dim callservice As New WCFEmailServices.EmailServiceClient()
callservice.TestService()
callservice.Close()

Веб-сервис:

    <ServiceContract()> _
    Public Interface IEmailService


        <OperationContract(IsOneWay:=True)> _
        Sub TestService()


    End Interface


    Public Class EmailService
    Implements IEmailService

    Public Sub TestService() Implements IEmailService.TestService

        Dim srvBody As String = ""
        srvBody = "START: " + DateTime.Now.ToLongTimeString() + System.Environment.NewLine
        Thread.Sleep(10000)
        srvBody += "END: " + DateTime.Now.ToLongTimeString() + System.Environment.NewLine

        Me.SendEmail("test@gmail.com", "test", srvBody, Nothing)

    End Sub


    Function SendEmail(ByVal srpTo As String, ByVal srpSubject As String, ByVal srpBody As String, ByVal srpAttachmentPath As String) As Boolean

        Dim MailMsg As New MailMessage(New MailAddress("No_Reply@test.com"), New MailAddress(srpTo))
        MailMsg.BodyEncoding = Encoding.UTF8
        MailMsg.Subject = srpSubject
        MailMsg.Body = srpBody
        MailMsg.IsBodyHtml = True

        If srpAttachmentPath IsNot Nothing Then
            Dim srvAttachment As New Attachment(srpAttachmentPath)
            MailMsg.Attachments.Add(srvAttachment)
        End If


        Dim SmtpMail As New SmtpClient("smtp.gmail.com", 587)
        SmtpMail.UseDefaultCredentials = False
        SmtpMail.EnableSsl = True
        SmtpMail.Credentials = New System.Net.NetworkCredential("No_Reply@test", "password")

        Try
            SmtpMail.Send(MailMsg)
        Catch
            Return False
        End Try
        Return True
    End Function

End Class

WebConfig:

            <system.serviceModel>
        <bindings>
   <wsHttpBinding>
    <binding name="WSHttpBinding_IEmailService" closeTimeout="00:01:00"
     openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
     bypassProxyOnLocal="false" transactionFlow="false" hostNameComparisonMode="StrongWildcard"
     maxBufferPoolSize="524288" maxReceivedMessageSize="65536" messageEncoding="Text"
     textEncoding="utf-8" useDefaultWebProxy="true" allowCookies="false">
     <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
      maxBytesPerRead="4096" maxNameTableCharCount="16384" />
     <reliableSession ordered="true" inactivityTimeout="00:10:00"
      enabled="false" />
     <security mode="Message">
      <transport clientCredentialType="Windows" proxyCredentialType="None"
       realm="" />
      <message clientCredentialType="Windows" negotiateServiceCredential="true"
       algorithmSuite="Default" establishSecurityContext="true" />
     </security>
    </binding>
   </wsHttpBinding>
  </bindings>
  <client>
   <endpoint address="http://localhost:61450/EmailService.svc" binding="wsHttpBinding"
    bindingConfiguration="WSHttpBinding_IEmailService" contract="WCFEmailServices.IEmailService"
    name="WSHttpBinding_IEmailService">
    <identity>
     <servicePrincipalName value="host/localhost" />
    </identity>
   </endpoint>
  </client>
  <services>
   <service behaviorConfiguration="WCFService.Service1Behavior"
    name="WCFService.Service1">
    <endpoint address="" binding="wsHttpBinding" contract="WCFService.IService1">
     <identity>
         <servicePrincipalName value="host/localhost" />
     </identity>
    </endpoint>
    <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
   </service>
   <service behaviorConfiguration="ClientWebApp.EmailServiceBehavior"
    name="ClientWebApp.EmailService">
    <endpoint address="" binding="wsHttpBinding" contract="ClientWebApp.IEmailService">
     <identity>
         <servicePrincipalName value="host/localhost" />
     </identity>
    </endpoint>
    <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
   </service>
  </services>
        <behaviors>
   <serviceBehaviors>
    <behavior name="WCFService.Service1Behavior">
     <serviceMetadata httpGetEnabled="true" />
     <serviceDebug includeExceptionDetailInFaults="false" />
    </behavior>
    <behavior name="ClientWebApp.EmailServiceBehavior">
     <serviceMetadata httpGetEnabled="true" />
     <serviceDebug includeExceptionDetailInFaults="false" />
    </behavior>
   </serviceBehaviors>
  </behaviors>
    </system.serviceModel>

1 ответ

Вы правильно закрываете клиента после вызова IsOneWay. В зависимости от вашей привязки close() блокируется до завершения IsOneWay.

Вы можете найти больше информации здесь: Вызов Close() для блоков Service Proxy после вызова One Way WCF

и из этого блога в ответе: WCF Best Practice # 5

Другие вопросы по тегам