Jeff Widmer's Blog

ASP.NET, ASP.NET MVC, C#, VB.NET, IIS7, Windows Forms, VB6, ASP 3.0

  • Remote Desktops MMC Snap-in on Windows 7

    Windows Server 2008 has a nice MMC Snap-in called “Remote Desktops” which provides a tree view of all of the Remote Desktop Connections for the various servers that you manage and then allows you to switch between them easily by just clicking on one of them in the tree view.  Windows 7 does not have this snap-in built-in by default but you can get it from the Remote Server Administration Tools update for Windows 7.  Below are instructions on how to configure your Windows 7 computer to use the Remote Desktops MMC Snap-in.

    Download and install the Remote Server Administration Tools for Windows 7 -     http://www.microsoft.com/download/en/details.aspx?id=7887.

    Browse to Control Panel > Programs > Turn Windows features on or off.

    image

    Scroll down to the “Remote Server Administration Tools” > “Role Administration Tools”.

    Check the “Remote Desktop Services Tools” checkbox.

    image

    Now you will have the Remote Desktops Snap-in which allows you to have a tree view of the various Windows servers that you manage.

    Start > Run > mmc.exe

    File > Add/Remove Snap-in…

    And then add the Remote Desktops snap-in:

    image

     

    image

  • The configuration section 'system.web.extensions' cannot be read because it is missing a section declaration

    After upgrading an ASP.NET application from .NET Framework 3.5 to .NET Framework 4.0 I ran into the following error message dialog when trying to view any of the modules in IIS on the server.

    2011-11-08 11h01_09

    What happened is during the upgrade, the web.config file was automatically converted for .NET Framework 4.0.  This left behind an empty system.web.extensions section:

    image

    It was an easy fix to resolve, just remove the unused system.web.extensions section.

     

    ERROR DIALOG TEXT:
    ---------------------------
    ASP
    ---------------------------
    There was an error while performing this operation.
    Details:
    Filename: \\?\web.config
    Line number: 171
    Error: The configuration section 'system.web.extensions' cannot be read because it is missing a section declaration
    ---------------------------
    OK  
    ---------------------------

  • Interop type 'AssemblyName.ClassName' cannot be embedded

    I recently upgraded some Visual Studio 2008 projects to Visual Studio 2010.  Most everything went very smoothly but I did run into one issue with some COM assemblies that were part of the project.

    At first the ASP.NET Web Application project built without issues, but then I ran into this error when visiting one of the pages:

    Could not load file or assembly 'Interop.AssemblyName' or one of its dependencies. An attempt was made to load a program with an incorrect format.

    Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.
    Exception Details: System.BadImageFormatException: Could not load file or assembly 'Interop.AssemblyName' or one of its dependencies. An attempt was made to load a program with an incorrect format.

    My solution to this issue was to remove the COM Assembly from the Visual Studio references and then to add it back in.  (I am not sure this was the proper solution but it worked.)

    But then when I added the COM assembly back into the project as a reference I could not build the project with errors such as:

    Interop type 'AssemblyName.ClassName' cannot be embedded. Use the applicable interface instead. 

    And others indicating that the project was not seeing the reference to the COM assembly.  Luckily this StackOverflow question (Interop type cannot be embedded) had the answer.

    The solution is to change a property on the referenced COM assembly.  To do this, in your Visual Studio 2010 project expand the References section and right-click on the COM assembly and select Properties.  This will bring up the Properties dialog for the COM assembly reference.

    2011-11-03 06h42_17

    Just change the “Embed Interop Types” property from True to False.  Now just rebuild your project and everything will be working.

     

    UPDATE (2011-12-13): The above solution to remove the assembly and then add it back and then set the Embed Interop Type to false does resolve the issue but the problem is that after a Visual Studio 2008 project is upgraded to Visual Studio 2010 there is not EmbedInteropTypes element in the COMReference node in the Visual Studio project XML.  And also there is not a PlatformTarget node in the build configuration (see next item).

    By default the Visual Studio Properties Dialog shows no value as false.  The missing element is probably causing an issue elsewhere during the compilation.  The easy fix, instead of removing and adding the COM Interop assemblies back in, is to just toggle the Embed Interop Types property from False to True and then back to False.  This will put the element in the COMReference properties (as shown below in the screenshot) and then everything else will continue to work.

    image

    In addition I have found that you need to toggle the Platform Target:

    image

    Just change it to one of the other values and then change it right back to “Any CPU”. This will insert the appropriate PlatformTarget element in the project file (see screenshot below).  Make sure you do this for all build configuration (and not just the debug).

    image

  • VB.NET IF() Coalesce and “Expression Expected” Error

    I am trying to use the equivalent of the C# “??” operator in some VB.NET code that I am working in.

    This StackOverflow article for “Is there a VB.NET equivalent for C#'s ?? operator?” explains the VB.NET IF() statement syntax which is exactly what I am looking for... and I thought I was going to be done pretty quickly and could move on.

    But after implementing the IF() statement in my code I started to receive this error:

    Compiler Error Message: BC30201: Expression expected.

    image

    And no matter how I tried using the “IF()” statement, whenever I tried to visit the aspx page that I was working on I received the same error.

    This other StackOverflow article Using VB.NET If vs. IIf in binding/rendering expression indicated that the VB.NET IF() operator was not available until VS2008 or .NET Framework 3.5.  So I checked the Web Application project properties but it was targeting the .NET Framework 3.5:

    image

    So I was still not understanding what was going on, but then I noticed the version information in the detailed compiler output of the error page:

    image

    This happened to be a C# project, but with an ASPX page with inline VB.NET code (yes, it is strange to have that but that is the project I am working on).  So even though the project file was targeting the .NET Framework 3.5, the ASPX page was being compiled using the .NET Framework 2.0.  But why?  Where does this get set?  How does ASP.NET know which version of the compiler to use for the inline code?

    For this I turned to the web.config.  Here is the system.codedom/compilers section that was in the web.config for this project:

    <system.codedom>
        <compilers>
            <compiler language="c#;cs;csharp" extension=".cs" warningLevel="4" type="Microsoft.CSharp.CSharpCodeProvider, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
                <providerOption name="CompilerVersion" value="v3.5" />
                <providerOption name="WarnAsError" value="false" />
            </compiler>
        </compilers>
    </system.codedom>

    Keep in mind that this is a C# web application project file but my aspx file has inline VB.NET code.  The web.config does not have any information for how to compile for VB.NET so it defaults to .NET 2.0 (instead of 3.5 which is what I need).

    So the web.config needed to include the VB.NET compiler option.  Here it is with both the C# and VB.NET options (I copied the VB.NET config from a new VB.NET Web Application project file).

        <system.codedom>
            <compilers>
                <compiler language="c#;cs;csharp" extension=".cs" warningLevel="4" type="Microsoft.CSharp.CSharpCodeProvider, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
                    <providerOption name="CompilerVersion" value="v3.5" />
                    <providerOption name="WarnAsError" value="false" />
                </compiler>
          <compiler language="vb;vbs;visualbasic;vbscript" extension=".vb" warningLevel="4" type="Microsoft.VisualBasic.VBCodeProvider, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
            <providerOption name="CompilerVersion" value="v3.5"/>
            <providerOption name="OptionInfer" value="true"/>
            <providerOption name="WarnAsError" value="false"/>
          </compiler>
        </compilers>
        </system.codedom>

     

    So the inline VB.NET code on my aspx page was being compiled using the .NET Framework 2.0 when it really needed to be compiled with the .NET Framework 3.5 compiler in order to take advantage of the VB.NET IF() coalesce statement.  Without the VB.NET web.config compiler option, the default is to compile using the .NET Framework 2.0 and the VB.NET IF() coalesce statement does not exist (at least in the form that I want it in).  FYI, there is an older IF statement in VB.NET 2.0 compiler which is why it is giving me the unusual “Expression Expected” error message – see this article for when VB.NET got the new updated version.

    EDIT (2011-06-20): I had made a wrong assumption in the first version of this blog post.  After a little more research and investigation I was able to figure out that the issue was in the web.config and not with the IIS App Pool.  Thanks to the comment from James which forced me to look into this again.

  • Find stored procedures that reference a table column

    We recently moved away from SQL Server replication and the database still has all of the rowguid columns and their associated indexes and constraints in it. We wanted to gain all of that disk space back so we went ahead with scripting out the delete of the indexes, constraints, and columns.

    One thing though is that there are many stored procedures in use and we needed to make sure none of these referenced the rowguid column.  The stored procedures really should not have used the rowguid column at all since it is solely created and used for SQL Replication, but you never know so we needed to confirm.

    The below script is what I created to search all of the stored procedures in the database for the rowguid column.  It could easily be modified to find any information within the stored procedures of a database.  (Note: One thing to watch out for is encrypted stored procedures.  This wouldn’t find anything in those so you would need to handle it through another method.)

    SELECT p.name, c.text FROM syscomments c
    JOIN sys.procedures p ON p.object_id=c.id
    WHERE c.text LIKE '%rowguid%'
    ORDER BY p.name

  • Lock request time out period exceeded

    I was trying to drop a foreign key for a table I was working on and I ran into a time out exception from SQL Server Management Studio:

    image

    TITLE: Microsoft SQL Server Management Studio
    ------------------------------
    Drop failed for ForeignKey 'fk_MyForeignKey'.  (Microsoft.SqlServer.Smo)
    ------------------------------
    ADDITIONAL INFORMATION:
    An exception occurred while executing a Transact-SQL statement or batch. (Microsoft.SqlServer.ConnectionInfo)
    ------------------------------
    Lock request time out period exceeded. (Microsoft SQL Server, Error: 1222)
    ------------------------------
    BUTTONS: OK
    ------------------------------

    I also tried dropping the foreign key manually using:

    ALTER TABLE MyTable DROP CONSTRAINT fk_MyForeignKey

    But this time the query was just sitting there running and running.  I let it run for some time and then when I checked the currently executing requests I found it was sitting in a suspended state.  What was interesting about the request was that the wait_time equaled the total_elapsed_time, so it was just waiting there for something else before proceeding.

    This is the sql query I used to see the currently executing requests (one of which was mine):

    SELECT r.session_id, r.status, r.start_time, r.command, s.text,
    r.wait_time, r.cpu_time, r.total_elapsed_time, r.reads, r.writes, r.logical_reads, r.transaction_isolation_level
    ,r.*
    FROM sys.dm_exec_requests r
    CROSS APPLY sys.dm_exec_sql_text(r.sql_handle) s

    And this in the particular row in question that made me realize my query was waiting on something else:

    image

    Now I needed to find out what is blocking my Alter Table command from running.  For that I used a query I found on this blog post Error 1222 Lock Request Time Out Period Exceeded When Set up Replication by Andrew Chen:

    select distinct object_name(a.rsc_objid), a.req_spid, b.loginame
    from master.dbo.syslockinfo a (nolock) join
    master.dbo.sysprocesses b (nolock) on a.req_spid=b.spid
    where object_name(a.rsc_objid) is not null

    I found that another SPID from SQL Server Management Studio was holding onto the table I was trying to alter.  Using sp_who2 with the SPID showed me the owner and where it was coming from, and also that it had been holding onto the table for 2 hours... and guess what!?!  It was me!  Smile

    I had been looking at the execution plan and client statistics of a query that I was performance tuning and that SQL Server Management window had a hold of the table I was trying to Alter.  As soon as I closed that window (and canceled that transaction) then I could drop the foreign key without a problem.

    Hopefully this will help someone else in the future!

  • ScrewTurn Wiki and Load User Profile

    Recently ran into an issue setting up a ScrewTurn Wiki site in a production environment.  The production environment uses a local account as the identity for the application pool.  After deploying the site I then went to visit it for the first time and the ScrewTurn wiki site gave me this exception:

    [SecurityException: Request for the permission of type 'System.Web.AspNetHostingPermission, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' failed.]

    After some checks to make sure the local account had the proper permissions to all of the necessary files, I finally tracked it down to a configuration setting on the Application Pool.  By default all of the application pools on this server were configured with the App Pool not to load the user profile.  Changing this to true resolved the issue.

    image

    Thanks to this blog post from Dave Burke and this ScrewTurn Wiki forum post for getting me to the solution.

  • How to create a page in Orchard that allows comments

    I am setting up a new Orchard site.  I want to use it for a simple list of articles and allow users to post comments on the articles. Out of the box this seems like it is enabled since the Orchard documentation for Adding Pages to Your Site indicates that you can enable user comments by just clicking the “Allow new comments” check box:

    User Comments

    To enable users to post comments on the page, select the Allow new comments check box. A form will be added to the bottom of the page for user comments. The following image shows the form that is added to the published page.

    But an out of the box installation of Orchard (1.1) does not have this checkbox when you create a new page.  So where is it and how do I enable comments on a Page in Orchard?

    To fix this problem you need to modify the Page content type to include the Comments content part.  Here are the instructions on how to do this:

    How to modify the page content type in Orchard to allow comments.

    Log in as an administrator and then head over to the Admin Dashboard.  On the left hand navigation, select the Content item.

    image

    Then click on the Content Types tab at the top.

    image

    Find the Page Content Type and click the edit link.

    image

    Click the Add Parts button.

    image

    And then check the Comments part check box.

    image

    Click Save on this page and then Save again on the Page content type.

    Now when you create a new Page in your Orchard site you will see the Allow new comments check box so that your users can leave comments on the page/article that you create.

    image

  • Unable to close Visual Studio 2008

    I ran into an issue with not being able to close Visual Studio 2008 today.  My Visual Studio 2008 solution opened and work fine but then when I tried to close it, Visual Studio would just freeze up.  Something was going on since the processor was saying about 25% usage or so and the mouse was blinking back and forth between the wait cursor and the default arrow but no matter how long I waited, Visual Studio 2008 would not close (it definitely looked like it was stuck in a loop doing something while trying to close down). 

    I was able to open and close another Visual Studio 2008 solution without any problems so this confirmed it was something specific to the this solution. 

    After trying a couple random things (such as closing all files, removing a reference, etc.) I tried deleting the Visual Studio Solution User Options .suo file.

    image

    Deleting the file solved the problem!

    So if you are ever in the same situation consider a corrupt .suo file to be the problem.