Создайте библиотеку классов MyInterfaces, в которой будут находиться только ваши интерфейсы:
Imports System.Runtime.Serialization
Imports System.ServiceModel
' NOTE: You can use the "Rename" command on the context menu to change the interface name "IService" in both code and config file together.
<ServiceContract()>
Public Interface IService
<OperationContract()>
Function GetData(ByVal value As Integer) As String
<OperationContract()>
Function GetDataUsingDataContract(ByVal composite As CompositeType) As CompositeType
<OperationContract()>
Function GetCustomer() As Customer
' TODO: Add your service operations here
End Interface
' Use a data contract as illustrated in the sample below to add composite types to service operations.
Public Class Customer
<DataMember()>
Public Property Name() As String
<DataMember()>
Public Property Age() As Integer
End Class
<DataContract()>
Public Class CompositeType
<DataMember()>
Public Property BoolValue() As Boolean
<DataMember()>
Public Property StringValue() As String
End Class
Добавить проект библиотеки веб-служб. Установите ссылку на вышеуказанный проект, который содержит вышеуказанные интерфейсы. Добавьте следующий код в этот проект:
Imports MyInterfaces
' NOTE: You can use the "Rename" command on the context menu to change the class name "Service" in code, svc and config file together.
Public Class Service
Implements IService
Public Function GetData(ByVal value As Integer) As String Implements IService.GetData
Return String.Format("You entered: {0}", value)
End Function
Public Function GetDataUsingDataContract(ByVal composite As CompositeType) As CompositeType Implements IService.GetDataUsingDataContract
If composite Is Nothing Then
Throw New ArgumentNullException("composite")
End If
If composite.BoolValue Then
composite.StringValue &= "Suffix"
End If
Return composite
End Function
Public Function GetCustomer() As MyInterfaces.Customer Implements MyInterfaces.IService.GetCustomer
Dim x As New Customer
x.Age = 15
x.Name = "Chad"
Return x
End Function
End Class
Добавьте третий проект, клиентское приложение, которое будет использовать Сервис. Я сделаю мое приложение WinForm. Иметь этот проект также ссылку на проект интерфейса. Добавьте этот код:
Imports System.ServiceModel
Imports MyInterfaces
Public Class Form1
Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
Dim endPoint As New EndpointAddress("http://localhost:9496/WCFService4/Service.svc")
Dim binding As New BasicHttpBinding()
Dim proxy As IService = ChannelFactory(Of IService).CreateChannel(binding, endPoint)
Dim getDateResult As String = proxy.GetData(3)
Dim myCompositeType As New MyInterfaces.CompositeType
myCompositeType.BoolValue = True
myCompositeType.StringValue = "ok"
Dim result As MyInterfaces.CompositeType = proxy.GetDataUsingDataContract(myCompositeType)
MessageBox.Show(result.StringValue)
End Sub
Это просто быстрый и грязный пример. Моя цель состояла в том, чтобы избавиться от сгенерированного прокси-объекта, который вы обычно получаете при использовании мастера добавления служб. Я полагаю, что конечная точка должна исходить из файла конфигурации, хотя я не уверен, как динамически определить, каким будет порт при отладке на веб-сервере VS.
Dim endPoint As New EndpointAddress("http://localhost:9496/WCFService4/Service.svc")
Единственное, что мне не нравится в этом, это то, что объекты, которые я передаю, например, объект Customer, представляющий потенциальный бизнес-объект, по-видимому, требуют, чтобы у них был конструктор по умолчанию без параметров. Я предпочитаю иметь конструкторы, чтобы гарантировать, что мой объект был правильно инициализирован, где бы он ни использовался.