Получение исключения HttpCompileException в представлении ServiceStack Razor (самостоятельное размещение)

СБОРКА 1

Это моя структура проекта (я обслуживаю контент из встроенных ресурсов):

Common_Assembly.dll
    Css
        Common.css
    Views
        Shared
            _Layout.cshtml

У него также есть класс Model.cs, который по сути просто:

public class Model
{
     public string Title {get; set; }
}

_Layout.cshtml

@model MyNameSpace.Model
<html>
    <head>
        <script language="javascript" href="css/common.css"></script>
        <title>@Model.Title</title>
    </head>
    <body>
        @RenderBody
    </body>
</html>

СБОРКА 2

Затем у меня есть вторая сборка (которая ссылается на вышеприведенную) и именно она содержит веб-службу:

Concrete_Assembly.dll
    Views
        Index.cshtml

У него есть класс с именем IndexResponse, производный от Model в другой сборке.

public class IndexResponse : Model
{ 
}

Index.cshtml

@Model MyOtherNameSpace.IndexResponse
<p>Test</p>

Теперь проблема. Если я удалю строку @Model, все будет работать правильно, и я увижу свою индексную страницу на странице макета другой DLL (Я использую собственный VirtualPathProvider для поиска ресурсов в нескольких библиотеках DLL). Однако, если я попытаюсь использовать IndexResponse в качестве модели на индексной странице, я получу HttpCompileException. Поскольку он выдается внешним компонентом, я на самом деле не знаю, что такое сообщение об исключении (я использую двоичные файлы стека службы).

Сначала я задавался вопросом, не потому ли это, что класс модели отличается от класса макета (даже если он происходит от него). Чтобы проверить эту теорию, я создал класс TestModel, производный от Model (помещенный в общую сборку), и использовал его - он работал нормально.

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

Любая помощь будет оценена по достоинству!

ИЗМЕНИТЬ

Для полноты вот фактический метод WebService. Я не верю, что здесь что-то не так, так как это работало нормально, когда я проводил другие тесты (вместо этого использовал TestModel).

    public IndexResponse Any(Index index)
    {
        return new IndexResponse() { Title = "Test Title" };
    }   // eo Any

ИЗМЕНИТЬ 2

Извиняюсь за все правки. Кроме того, могу ли я каким-либо образом получить это исключение или обработать его, чтобы посмотреть на ошибку? Было бы неплохо поймать это и отобразить — иначе разрабатывать эти страницы как встроенные ресурсы будет все равно, что вырывать зубы :)

ИЗМЕНИТЬ 3

Следуя некоторым предложениям Mythz и добавляя правильные пространства имен в конфигурацию Razornamespaces, я, наконец, устранил ошибку, которую он выдает:

+ $exception {"(0): error CS1704: An assembly with the same simple name 'Concrete_Assembly, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null has already been imported. Try removing one of the references or sign them to enable side-by-side."} System.Exception {System.Web.HttpCompileException} `


person Moo-Juice    schedule 09.07.2013    source источник


Ответы (1)


Если вы еще этого не сделали, добавьте любые сборки, которые вы используете, в свой app.config, например:

<system.web.webPages.razor>
<host factoryType="System.Web.Mvc.MvcWebRazorHostFactory, System.Web.Mvc, 
  Version=3.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
<pages pageBaseType="ServiceStack.Razor.ViewPage">
  <namespaces>
    <add namespace="ServiceStack.Html" />
    <add namespace="ServiceStack.Razor" />
    <add namespace="ServiceStack.Text" />
    <add namespace="ServiceStack.OrmLite" />
    <add namespace="Concrete_Assembly" />
    <add namespace="Common_Assembly" />
  </namespaces>
</pages>
</system.web.webPages.razor>

Также отключите веб-страницы ASP.NET:

<appSettings>
  <add key="webPages:Enabled" value="false" />
</appSettings>

См. приложение RazorRockstars Self Host.config. ссылка.

person mythz    schedule 09.07.2013
comment
Есть ли способ установить их программно, а не через app.config? - person Moo-Juice; 09.07.2013
comment
Да, вы можете добавить их в Config.RazorNamespaces, но поддержка Razor во время разработки VS.NET (т.е. intelli-sense) выглядит в конфигурации web.config. - person mythz; 09.07.2013
comment
Спасибо за это. У меня есть Web.configs в моих библиотеках DLL для поддержки IntelliSense, но в моем сценарии app.configs — это не то, что мне нужно. Пробуем программный подход, пока мы говорим. Спасибо! - person Moo-Juice; 09.07.2013
comment
На самом деле, похоже, у меня нет свойства RazorNamespaces как Config? - person Moo-Juice; 09.07.2013
comment
Когда вы видите Config, мы всегда имеем в виду EndpointHostConfig , где находится вся конфигурация ServiceStack. Вот Config.RazorNamespaces - person mythz; 09.07.2013
comment
Да, это то, что я думал, что вы имели в виду, но по какой-то странной причине это не собственность... - person Moo-Juice; 09.07.2013
comment
ах да, я забыл сказать, что это статика :) - person mythz; 09.07.2013
comment
Привет Миф. Я реализовал это, но получил HttpCompileException в другом месте (даже если я его удалю). Есть ли способ узнать, что это за ошибка компиляции, или как-то отобразить ее? - person Moo-Juice; 10.07.2013
comment
Я внес изменения, так как это ошибка, которая в настоящее время возникает при компиляции бритвы. - person Moo-Juice; 10.07.2013
comment
Markthing настолько же верен, насколько я считаю, что моя новая проблема не связана с этим вопросом и касается того, как мое приложение инициализирует и скрывает библиотеки DLL во временном каталоге. Еще раз спасибо за помощь, и если бы вы могли сообщить мне, как я могу поймать это исключение, это было бы здорово! :) - person Moo-Juice; 10.07.2013