ASP.NET MVC и WCF

Исключение нулевого указателя генерируется, когда приложение пытается использовать null в случае, когда требуется объект. К ним относятся:

  1. Вызов метода экземпляра объекта null.
  2. Доступ или изменение поля объекта null.
  3. Принимая длину null, как если бы это был массив.
  4. Доступ или изменение слотов null, как если бы это был массив.
  5. Бросок null как будто это было значение Throwable.

Приложения должны бросать экземпляры этого класса, чтобы указать на другие незаконные использования объекта null.

Ссылка: http://docs.oracle.com/javase/8/docs/api/java/lang/NullPointerException.html

27
задан Peter Mortensen 1 April 2010 в 03:13
поделиться

4 ответа

Сервисы WCF могли бы иметь смысл в этой ситуации, но не создают сервисы, которые выравниваются с Вашим UI, создают сервисы, которые выравниваются с бизнес-процессами. т.е. у Вас не будет сервиса, который возвращает данные представления для каждой страницы, у Вас будет сервис, который представляет логические операции. Затем Ваш сайт может назвать те же сервисы, которые называет клиент окон, но Вы не должны связывать дизайн клиента окон к дизайну веб-сайта.

Вместо этого:

Windows Client-> Сервисы-> веб-сайт

Это должно быть:

Windows Client-> Сервисы

веб-сайт-> Сервисы

47
ответ дан jezell 28 November 2019 в 04:38
поделиться

Вы могли использовать Услуги передачи данных ADO.NET для совместного использования данных с любым JSON (для клиентов JavaScript) или XML (для настольных приложений).

ASP.NET MVC может тогда использовать в своих интересах это при помощи любого из два в модели. Как Вы, вероятно, знаете, Услуги передачи данных ADO.NET основан на WCF, таким образом, Вы были на правильном пути.

9
ответ дан Jan Carlo Viray 28 November 2019 в 04:38
поделиться

Вы не можете использовать только один список, потому что вы не почувствуете глубины дерева. Таким образом, вам определенно требуется два или более списков.

Вот моя попытка решения:

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

Обход вашего почтового заказа может определять глубину дерева. Например, предположим, что у меня есть такая структура:

      1
  2   5   6
 3 4  7

Where 2 is the parent of 3 and 4, and 5 is the parent of 7.

Preorder: 1 2 3 4 5 7 6
Postorder: 3 4 2 7 5 6 1

Мы знаем, что начинаем с 1, потому что это первый узел в обходе предварительного заказа. Затем мы смотрим на следующее число, 2. В почтовом порядке, поскольку число 2 идет ПЕРЕД узлом 1, мы знаем, что 2 должен быть потомком 1. Затем мы смотрим на 3. 3 идет перед 2, и, следовательно, 3 является потомком 2. 4 - это потомок 2, но после 3, поэтому мы знаем, что 4 - это потомок 2, но НЕ ребенок 3. И т.д.

Итак, некоторый код, который переопределяет событие OnActionExecuted, например:

public class JsonOrXml : ActionFilterAttribute
{
    private static UTF8Encoding UTF8 = new UTF8Encoding(false);

    public override void OnActionExecuted(ActionExecutedContext filterContext)
    {
        // setup the request, view and data
        HttpRequestBase request = filterContext.RequestContext.HttpContext.Request;
        ViewResult view = (ViewResult)(filterContext.Result);
        var data = view.ViewData.Model;

        String contentType = request.ContentType ?? string.Empty;

        // JSON
        if (contentType.Contains("application/json") || (string)view.ViewData["FORMAT"] == "json")
        {
            filterContext.Result = new JsonResult
            {
                Data = data
            };
        }

        // POX
        else if (contentType.Contains("text/xml") || (string)view.ViewData["FORMAT"] == "xml")
        {
            // MemoryStream to encapsulate as UTF-8 (default UTF-16)
            // http://stackoverflow.com/questions/427725/
            //
            // MemoryStream also used for atomicity but not here
            // http://stackoverflow.com/questions/486843/
            //using (MemoryStream stream = new MemoryStream(500))
            //{
            //    using (var xmlWriter =
            //        XmlTextWriter.Create(stream,
            //            new XmlWriterSettings()
            //            {
            //                OmitXmlDeclaration = false,
            //                Encoding = UTF8,
            //                Indent = true
            //            }))
            //    {
            //        new XmlSerializer(data.GetType()).Serialize(xmlWriter, data);
            //    }

            //    filterContext.Result = new ContentResult
            //    {
            //        ContentType = "text/xml",
            //        Content = UTF8.GetString(stream.ToArray()),
            //        ContentEncoding = UTF8
            //    };
            //}

            XmlDeclaration xmlDecl = new XmlDocument().CreateXmlDeclaration("1.0", "UTF-8", "yes");

            filterContext.Result = new ContentResult
            {                    
                ContentType = "text/xml",
                Content = xmlDecl.OuterXml + data.ToString(),
                ContentEncoding = UTF8
            };
        }
    }
}

Итак, закомментированный фрагмент - это код, который я нашел - см. ссылки на stackoverflow, чтобы узнать, где я его получил:)

Я переопределил метод ToString () на всех мои бизнес-объекты должны возвращать строку, представляющую, как бизнес-объект хотел бы представлять себя как xml. WCF выполняет это с помощью атрибутов, но мне нужно было более чистое решение, которое не полагалось бы на отражение, И я не хотел иметь и проект веб-сайта, и проект WCF - проблема с двумя проектами в том, что было трудно сохранить их оба. синхронно в отношении функциональности - я бы получил запросы типа «почему служба не позволяет мне фильтровать мои результаты, как это делает веб-сайт?»

Меня очень интересуют отзывы других об этом подходе :)

Вот' s пример бизнес-объекта:

public class ContentFile : Entity
{
    public ContentBook BelongsToBook { get; set; }
    public string FileName { get; set; }
    public XElement FileXml { get; set; }
    public Binary FileData { get; set; }
    public List<ContentFile> Versions { get; set; }
    public List<ContentNode> ContentNodes { get; set; }

    public override string ToString()
    {
        return this.ToString(SaveOptions.DisableFormatting);
    }

    public string ToString(SaveOptions options)
    {
        XElement xml = XElement.Parse("<contentFile id=\"" + Id.ToString() + "" + "\" />");
        xml.Add(new XElement("fileName", FileName));
        xml.Add(new XElement("fileStructure", FileXml));
        xml.Add(base.ToString(options));
        return xml.ToString(options);
    }
}
8
ответ дан 28 November 2019 в 04:38
поделиться

Вы можете использовать OData для своего приложения MVC для обработки материалов типа Xml / Json. Я знаю, что другие люди предлагали использовать свой собственный - и это то, что я сейчас делаю ... с помощью моего собственного настраиваемого ActionFilter или настраиваемого ViewResult.

Пример кода OData: Сообщение в блоге Скотта Хансельмана OData + StackOverflow .

2
ответ дан 28 November 2019 в 04:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: