我对WCF很新,我已经设置了一个测试网站和服务。我正在尝试两个完成两件事:
我创建了一个web服务并为其提供了isoneway属性。我设法在不阻止用户的情况下调用它,但我担心我没有关闭客户端。如何在不阻止用户的情况下调用此服务并仍然正常关闭客户端?我应该使用异步方法(TestServiceAsync)吗?我应该使用BeginXX,EndXX方法吗?
客户端:
Dim callservice As New WCFEmailServices.EmailServiceClient()
callservice.TestService()
callservice.Close()
web服务:
<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>
答案 0 :(得分:0)
您正在IsOneWay通话后正确关闭客户端。根据您的绑定,close()将阻塞,直到IsOneWay完成。
您可以在此处找到更多信息:Calling Close() on Service Proxy blocks after One Way WCF call
来自此博客的答案:WCF Best Practice #5