Loading...
coaster avatar coaster 412 Точки

[Homework] WS&Cloud - Distance Calculator Client

Здравейте, пробвах се с първото домашно от Web Services & Cloud и още на първата задача излезе няква странна грешка във WCF Test Client-a (Failed to add a service. Service metadata may not be accessible), която оправих с добавяне на [Serializable] преди дефинирането на класа Point. Следващата грешка, която нямам идея защо се появява и заради която пиша тук, е че в клиента не ми разпознава конструктора от service-a. Може би бъркам нещо със самия конструктор, тъй като ООП-то ми е леко чуждо :) Идеи? Мисля, че със screenshot ще е по-ясно, отколкото с пускане на код.

грешка - ЦЪК

EDIT: Ако някой все пак държи на код :D

Тагове:
0
C# Web Services & Cloud 18/08/2015 00:35:49
FlipRF avatar FlipRF 16 Точки

Нямаш нужда от собствен клас Point, просто реферирай библиотеката System.Drawing

1
coaster avatar coaster 412 Точки

Като ти прочетох отговора, се пляснах по челото, чудейки се как не съм се сетила за това :D Но след като го пробвах, имаше същия проблем. А и всъщност в screenshot-a в домашното се вижда, че са ползвали Calculator.Point, а не System.Drawing.Point, което подсказва, че е собствен клас. Но както и да е, и по двата начина проблемът е един и същ.

1
mbencheva avatar mbencheva 52 Точки

АМи доколкото виждам ти не си направила референция към твоя клас Point. Като дадеш F12 на Point klasa отива в някакъв друг клас, който се наследява отнякъде. Пробвай да сложиш референция към първия проект  и му дай using ....+

DistanceCalculatorSoapService.Point a = new DistanceCalculatorSoapService.Point(5, 5);

И аз не съм голям спец на ООП-то , но и аз имах подобен проблем и така се оправи.

1
coaster avatar coaster 412 Точки

Добавих референцията и изрично му набих в главата (в кода) откъде да взима този въпросен Point :D Пак същата работа, че наизскочиха и още грешки. След консултация със StackOverflow разбрах, че "нямало начин да се вземе конструктор чрез service". Ии както и да е, май замазах положението - в крайна сметка добавих празен конструктор за Point в Reference.cs, откъдето всъщност се взима информацията за класа, когато работим с клиента, и създавам нова точка по следния начин
Point a = new Point { x = 5,  y = 5 };
Благодаря ти за отговора!

2
idmitrov avatar idmitrov 55 Точки

Привет,

Ето тук липсва конструктора http://prntscr.com/85872a иначе да System.Drawing в случая ти е достатъчен.

Незнам защо не ти е добавило автоматично конструктор при генерирането на файлчетата на референцията, предполагам когато си я добавяла е нямало конструктор.

1
coaster avatar coaster 412 Точки

Здравей, ами имаше го конструктора в сървиса, но явно Visual Studio-то си е имало собствено мнение по това време и не го е добавило в reference (нали винаги обвиняваме VS когато нещо не става :D). В последствие го добавих ръчно тук, където си посочил, и май проработи. Доколко това е добра практика, не знам, но може би ще се тревожим за това по-натам..
Благодаря!

1
yuletodim avatar yuletodim 37 Точки

Здравей! Не знам до колко съм права, но class Point трябва да го дефинираш в интерфейса на сървиса. Наков го спомена доста бегло в лекцията. При мен тръгна от раз. Над всяко пропърти обаче трябва да сложиш нотификация [DataMember], иначе клиента не го вижда.

[DataContract]
    public class Point
    {
        private double x;
        private double y;

        [DataMember]
        public double X
        {
            get { return x; }
            set { x = value; }
        }

        [DataMember]
        public double Y
        {
            get { return y; }
            set { y = value; }
        }
    }

 

В клиента:

client.CalcDistance(startPoint, endPoint);

1
AleksandurSeferinkin avatar AleksandurSeferinkin 333 Точки

Напротив! Добра практика е да дефинираш подобни структури данни в отделна библиотека, което ще оправи и проблема с конструктора. Когато дефинираш структурата в асемблито на WCF, тя се рефлектира в клиента. Това, което клиента вижда и ползва, не е това, което си дефинирала в WCF. Много е лошо да дефинираш повече от едно нещо в един файл!

Аз лично дефинирах Point в отделен файл и пак работи, но конструктора си остава default-ния.

Атрибутите със сигурност са задължителни, защото явно WCF сериализира данните, което е и логично. В този ред на мисли клиента вижда само структурите, които имат атрибут [DataContract] и пропъртитата, които имат атрибут [DataMember]. Тези два атрибута се ползват и за JSON.

И един съвет: подобни структури данни, които съдържат до 4 полета (или 16 байта), се дефинират като "struct", а не като "class". Разликата между двете е следната: struct е value type, а class е reference type. Value типовете се пазят в стек паметта, следователно достъпа до тях е бърз. Reference типовете се пазят в heap паметта, а само тяхната референция(адрес в паметта) се пази в стека - от там идва и името. Struct се ползва за съвкупност от данни - без логика, без методи - само полета и пропъртита. Хубаво е да се знаят тези неща. :)

3
17/08/2015 23:30:05
Можем ли да използваме бисквитки?
Ние използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Можете да се съгласите с всички или част от тях.
Назад
Функционални
Използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Използваме „сесийни“ бисквитки, за да Ви идентифицираме временно. Те се пазят само по време на активната употреба на услугите ни. След излизане от приложението, затваряне на браузъра или мобилното устройство, данните се трият. Използваме бисквитки, за да предоставим опцията „Запомни Ме“, която Ви позволява да използвате нашите услуги без да предоставяте потребителско име и парола. Допълнително е възможно да използваме бисквитки за да съхраняваме различни малки настройки, като избор на езика, позиции на менюта и персонализирано съдържание. Използваме бисквитки и за измерване на маркетинговите ни усилия.
Рекламни
Използваме бисквитки, за да измерваме маркетинг ефективността ни, броене на посещения, както и за проследяването дали дадено електронно писмо е било отворено.