Как позвонить в службу IsOneWay WCF и как правильно закрыть клиента
Я очень новичок в WCF, и я настроил тестовый веб-сайт и сервис. Я пытаюсь сделать две вещи:
- Позвоните в сервис без блокировки пользователя
- Закройте клиент правильно
Я создал веб-сервис и присвоил ему атрибут 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