Avatar billede hojgaard Nybegynder
02. juni 2010 - 19:53 Der er 4 kommentarer og
1 løsning

Udvide proxy klassen

Hej E'er

Jeg er rendt ind i en udfordring omkring at arve fra en proxy klasse.
Her er problemet:

Lad os sige jeg har en webservice, der stiller følgende services tilrådighed:

namespace WebService1
{
    [WebService(Namespace = "http://tempuri.org/")]
    [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
    [System.ComponentModel.ToolboxItem(false)]
    public class Service1 : System.Web.Services.WebService
    {
        [WebMethod]
        public WebService1.Customer GetCustomerByID(string id)
        {
            // ...
        }

        [WebMethod]
        public void UpdateCustomer(WebService1.Customer customer)
        {
            // ...
        }
    }
}


Fra webservicen får jeg fint en Customer, men for at kunne bruge Customer objektet i mit eget system, vil jeg gerne udvide den med flere properties.

namespace MySystem
{
    public class Customer : WebService.Customer
    {
        public string MyCustomProperty { get; set; }
    }
}



Nemt, og det virker også fint i mit eget system.
Problemet kommer når jeg har modificeret Customer, og skal opdatere via webservicen igen.

MySystem.Customer customer = new MySystem.Customer();
customer.MyCustomProperty = "xxyy";

WebService.Service1 service = newWebService.Service1();
service.UpdateCustomer(customer);


Dette resulterer i følgende en System.InvalidOperationException.
Message=There was an error generating the XML document.


Selv en cast af Customer vil webservicen ikke acceptere:
service.UpdateCustomer((WebService.Customer)customer);


Samme exception bliver stadig kastet.
Nogen ideer til hvordan jeg får webservicen til at acceptere min Customer?
Avatar billede Slettet bruger
02. juni 2010 - 21:06 #1
Hvad er formålet med din ekstra property - skal den bruges serverside? Hvis det er tilfældet skal du have opdateret datacontract'en til at omfatte dine ekstra properties.

Problemet er at du med en nedarvet klasse ikke længere overholder kontrakten.

Hvis det alene er for at lave noget client-side, kan du 'pakke' din proxy ind i en anden klasse, så proxy'en ligger som en intern variabel i klassen og den 'omsluttende' klasse blot videredelegerer properties fra proxy'en. Når du så skal have den tilbage til webservicen sender du alene den interne proxy istedet for den 'omsluttende' klasse.

Håber det gav mening.
Avatar billede hojgaard Nybegynder
02. juni 2010 - 21:35 #2
De ekstra properties er kun til brug clientside - aldrig serverside.

Ja, en wrapperklasse havde jeg tænkt på, men vil helst undgå den. Havde virkelig håbet på en workaround.

Tak for kommentaren goblinhero!
Avatar billede arne_v Ekspert
03. juni 2010 - 03:32 #3
Jeg tror ikke på sub klasse ideen. Det kommer aldrig til at virke godt.

Hvad med:

namespace WebService
{
    public partial class Customer
    {
        public string MyCustomProperty { get; set; }
    }
}
Avatar billede hojgaard Nybegynder
03. juni 2010 - 08:27 #4
Perfekt arne_v!

Jeg havde prøvet denne løsning tidligere, men kunne ikke få det til at virke. Gav det lige en chance til... det virkede.

Tak for hjælpen... smider du ikke et svar?
Avatar billede arne_v Ekspert
03. juni 2010 - 15:16 #5
kommer her
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester