Прокси-классы Javascript для составных объектов в WCF - PullRequest
0 голосов
/ 02 ноября 2010

У меня есть служба WCF, которую я создал и работает. На данный момент это очень базовая услуга и имеет следующий код:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.Text;
using System.ServiceModel.Activation;


[ServiceContract(Namespace = "TestServiceNameSpace")]
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
public class MyTestService
{

    [OperationContract]
    public MyNamespace.MyCompoundType ReturnMyCompoundType()
    {

        return new MyNamespace.MyCompoundType { DateVal = DateTime.Now, IntegerVal = 256, StringVal = "Pedro's test" };
    }

}

Ниже приведен класс MyCompoundType

using System.Runtime.Serialization;
using System;
using System.ComponentModel;
namespace MyNamespace
{

    [DataContract]    
    public class MyCompoundType : IMyCompoundType
    {
        [DataMember]
        public int IntegerVal { get; set; }

        [DataMember]
        public string StringVal { get; set; }

        [DataMember]
        public DateTime DateVal { get; set; }
    }
}

Теперь, когда я посмотрел на файл JS для этой службы, перейдя к http://localhost/MyTestService.svc/jsdebug (который я затем использую для выполнения своих вызовов Ajax), я заметил, что для MyCompoundType не создан прокси-сервер. поэтому, когда я включаю этот JS-файл, все работает нормально, и я могу позвонить в службу, но я не могу объявить переменную javascript типа MyCompoundType (это прокси-тип). Это вообще возможно? Основная часть этого заключается в том, чтобы мы использовали функциональность intellisense в javascript, чтобы избежать ошибок, подобных тому, что кто-то печатает:

var mycompundTypeReturn = returnValueFromWCFCall;
alert(mycompoundTypeReturn.StrVal); //this will give us an error because mycompoundTypeReturn.StrVal does not exist, only mycompoundTypeReturn.StringVal exists

Можно ли сгенерировать прокси-файл JS, используя svcutil.exe и указав более подробную информацию? Есть ли какие-то атрибуты, которые я пропустил? Это вообще возможно? Имеет ли это смысл при использовании WCF?

Любая помощь будет принята с благодарностью, или даже ответ «Вы тратите свое время на это, это невозможно, и вы упустили смысл WCF» будет оценен.

Спасибо

1 Ответ

0 голосов
/ 28 февраля 2011

После поиска возрастов я все еще ничего не нашел при автоматической генерации прокси-классов для вызовов Ajax, поэтому в конце я написал небольшое приложение для генерации скриптов, которое просматривает определенную библиотеку .Net, а затем для каждого класса в этой библиотеке создает Javascript представление этого класса. Итак, для объекта выше, он генерирует следующий класс javascript:

var MyLibEntities = new function () {

this.MyLibBase = function () {
    var t = this;
};
this.MyLibBase.prototype.entityHashCode = null;
this.MyLibBase.prototype.validate = function () {
    return ValidateObject(this);
};
this.MyLibBase.prototype.getEntityName = function () {
    if (this.__type != null) {
        //split the __type param with : to get the Entity Name - 1st element
        var ary = this.__type.split(":");
        if (ary.length > 0)
            return ary[0]
        else
            return this.__type;
    }
}
this.MyLibBase.prototype.clone = function (source) {
    if (source !== undefined && source !== null) {
        //if the source object is not of the same type we should not instantiate the object
        if (this.__type != source.__type) {
            var errormsg = "Object type '" + source.__type + "' does not match object type '" + this.__type + "'";
            if (typeof console != "undefined")
            { console.log(errormsg); }
            throw new Error(errormsg);
        }
        for (var i in source) {
            if (typeof this[i] != "undefined")
            { this[i] = source[i]; }
        }
    }
};

this.MyCompoundType = function (wo) {
    var t = this;
    t.__type = "MyCompoundType:#MyLib.Entities";
    //assign all the properties from the referencing object
    this.clone(wo);
};

this.MyCompoundType.prototype = new this.MylibBase();
this.MyCompoundType.prototype.constructor = this.MyCompoundType;
this.MyCompoundType.prototype.IntegerVal = null;
this.MyCompoundType.prototype.StringVal = null;
this.MyCompoundType.prototype.DateVal = null;

}

Хотя это не совсем тот же тип, он дает мне intellisense, и я могу передать этот объект в методы MSAjax. Его конструктор может получить объект JSON, переданный обратно из WCF, который затем используется в функции clone для назначения свойств.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...