Ищу проект рабочего решения «Hello World WCF без SVCUtil» для загрузки, предпочтительно в VB.NET

#vb.net #wcf

#vb.net #wcf

Вопрос:

Может ли кто-нибудь указать мне на пример решения, которое я могу загрузить? У меня возникли проблемы при попытке его найти.

Комментарии:

1. Вы серьезно? Просто используйте «Добавить ссылку на службу».

2. Существует множество руководств по началу работы — просто следуйте одному и создайте свое собственное.

3. @John: Добавить ссылку на службу ИСПОЛЬЗУЕТ SvcUtil.exe . Серьезно.

4. нет, это не так, вот почему я предложил это.

5. Добавить ссылку на службу на самом деле почти такой же код, как svcutil.exe , но он не вызывает svcutil.exe .

Ответ №1:

Создайте библиотеку классов 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 amp;= "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. Попросите этот проект также ссылаться на интерфейс projrect. Добавьте этот код:

 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, которые представляют потенциальный бизнес-объект, похоже, требуют, чтобы у них был конструктор без параметров по умолчанию. Я предпочитаю иметь конструкторы, гарантирующие, что мой объект был должным образом инициализирован, где бы он ни использовался.