Основной вопрос WCF - PullRequest
       18

Основной вопрос WCF

0 голосов
/ 16 сентября 2011

Обычно я могу создать экземпляр класса с именем SalesItem и передать его в качестве параметра веб-службе, например webService.CreateSalesitem(New SalesItem()). Это прекрасно работает.

Затем я подклассифицировал свой класс SalesItem.Я назвал это GP_Item_SIM_Product.Однако, когда я пытаюсь передать этот класс в качестве параметра моему веб-сервису, я получаю исключение.webService.CreateSalesitem(new GP_Item_SIM_Product())

Вот исключение:

Произошла ошибка при попытке сериализации параметра http://schemas.microsoft.com/dynamics/gp/2010/01:salesItem. Сообщение InnerException было «Тип» IMS.GP_Item_SIM_Product 'с именем контракта данных 'GP_Item_SIM_Product: http://schemas.datacontract.org/2004/07/IMS' не ожидается.Рассмотрите возможность использования DataContractResolver или добавьте любые типы, которые не известны статически, в список известных типов - например, с помощью атрибута KnownTypeAttribute или добавив их в список известных типов, переданных в DataContractSerializer. '.Пожалуйста, смотрите InnerException для получения более подробной информации.

Вот мой подкласс:

Imports System.ServiceModel
Imports GP_1.DynamicsGPClient
Imports GP_1.Microsoft.Dynamics.GP
Imports GP_1.Microsoft.Dynamics.Common
Imports SierraLib
Imports GP_1.GP
Imports GP_1
Imports System.Runtime.Serialization

< DataContract() > _
Public Class GP_Item_SIM_Product
    Inherits SalesItem

    Dim SIMProduct As Products
    Dim greatPlainsRunner As GPRunner

    Public Sub New(ByVal gpr As GPRunner, ByVal product As Products)
        SIMProduct = product
        greatPlainsRunner = gpr
        SetValues()
    End Sub

    Private Sub SetValues()
        Me.Key = New ItemKey() With {.Id = SIMProduct.MFGPN}
        Me.Description = Description
        Me.CurrentCost = New MoneyAmount() With {.Currency = Defaults.usCurrency, .Value = CDec(SIMProduct.Cost)}
        Me.StandardCost = New MoneyAmount() With {.Currency = Defaults.usCurrency, .Value = CDec(SIMProduct.Price)}
        Me.IsDiscontinued = Not SIMProduct.Enabled
        Me.SalesTaxBasis = IIf(CBool(SIMProduct.Taxed = True),
                            GP_1.Microsoft.Dynamics.GP.SalesTaxBasis.Taxable,
                            GP_1.Microsoft.Dynamics.GP.SalesTaxBasis.Nontaxable)
    End Sub


End Class

Любые идеи, как я могу изменить свой класс, чтобы его можно было отправить в веб-сервис.Я думаю, что это как-то связано с двумя полями в этом классе, которые я добавил.Не уверен, что мне нужно пометить их как что-то особенное.

Ответы [ 2 ]

0 голосов
/ 16 сентября 2011

Вам необходимо добавить атрибут ServiceKnownType к контракту на обслуживание - это Interface, который определяет ваше обслуживание и содержит подпись для операции CreateSalesitem.

<ServiceKnownType(GetType(GP_Item_SIM_Product))> 
Public Interface IWebService
0 голосов
/ 16 сентября 2011

Попробуйте добавить <ServiceKnownType(GetType(GP_Item_SIM_Product))> к договору на обслуживание.

...