Quick way to check .NET Framework version in Powershell

Get-ChildItem 'HKLM:\SOFTWARE\Microsoft\NET Framework Setup\NDP' -recurse |
Get-ItemProperty -name Version,Release -EA 0 |
Where { $_.PSChildName -match '^[^0-9S]'} |
Select PSChildName, Version, Release, @{
name="Product"
expression={
switch -regex ($_.Release) {
    "378389" { [Version]"4.5" }
    "378675|378758" { [Version]"4.5.1" }
    "379893" { [Version]"4.5.2" }
    "393295|393297" { [Version]"4.6" }
    "394254|394271" { [Version]"4.6.1" }
    "394802|394806" { [Version]"4.6.2" }
    {$_ -gt 394806} { [Version]"Undocumented 4.6.2 or higher, please update script" }
    }
  }
}

Very useful tip to check .Net Framework version:

Run above commands in Windows Powershell to get .Net version currently installed in your windows.

Powershell check .Net Framework version

Powershell check .Net Framework version

References:

Advertisements

Debug Dataset error

I got this error:

Failed to enable constraints. One or more rows contain values violating non-null, unique, or foreign-key constraints.

With the debug tricks from PaulStock, that helps!

References: http://stackoverflow.com/questions/7026566/failed-to-enable-constraints-one-or-more-rows-contain-values-violating-non-null

 

IIS Handler for Custom Url

Recently need to setup environment for bug fix.

The client side code calling url like http://somewhere/upload/, while at the server side the url need to receives the POST request from client to perform certain actions.

We have the ready client code to send the POST request with the contents, the missing part is the receiving side, the url in server. Current code will always give us error whenever calls made to the url because the url does not exists at all. My mission today will be faking a url to receives request and output the content as a new file, so we can test the bug fix later on.

Client code: (Refer to Posting multipart/form-data Using .NET WebRequest)

private string ExecutePostRequest(
Uri url,
Dictionary<string, string> postData,
string fileMimeType
)
{
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url.AbsoluteUri);
request.Method = "POST";
request.KeepAlive = false;
string boundary = "ILikeSeperator";
request.ContentType = "multipart/form-data; boundary=" + boundary;
request.Credentials = CredentialCache.DefaultCredentials;

// Connect to server and start sending data (use POST)
Stream requestStream = request.GetRequestStream();
postData.WriteMultipartFormData(requestStream, boundary);

byte[] endBytes = System.Text.Encoding.UTF8.GetBytes("--" + boundary + "--");
requestStream.Write(endBytes, 0, endBytes.Length);
requestStream.Close();

// Get back response from server
using (WebResponse response = request.GetResponse())
using (StreamReader reader = new StreamReader(response.GetResponseStream()))
{
return reader.ReadToEnd();
};
}

Nothing much to say about the client code 😀

Server Code: (My works here)

The url I going to creates is http://localhost/uploadTest. We need to add a ashx handler in IIS to handle the calls into this url. The handler will create a new text file base on contents sent by client.

There are total 6 steps needed and the sequence numbers will be highlight in Bold + red colour = Number

~~~ 0 ~~~ 0 ~~~

1- First follow the must read step-by-step guides on creating handler for specific url – ASP.NET ASHX Handler

Project created follow above guide, removed unnecessary .aspx and files.

Aspx Handler Project

2- Another important step, use correct Web.config:-


<?xml version="1.0"?>
<!--
For more information on how to configure your ASP.NET application, please visit
http://go.microsoft.com/fwlink/?LinkId=169433
-->
<configuration>
<system.web>
<customErrors mode="Off"/>
<urlMappings enabled="true">
<add url="~/Default.aspx" mappedUrl="~/FileUploadHandler.ashx"/>
</urlMappings>
<compilation debug="true"/>
</system.web>
<system.webServer>
<modules>
<remove name="WebDAVModule"/>
</modules>
<handlers accessPolicy="Read, Write, Execute, Script">
<remove name="StaticFile"/>
<remove name="SimpleHandlerFactory-ISAPI-2.0"/>
<remove name="WebDAV"/>
<remove name="SimpleHandlerFactory-Integrated-4.0"/>
<remove name="SimpleHandlerFactory-Integrated"/>
<add name="SimpleHandlerFactory-Integrated" path="*.ashx" verb="GET,HEAD,POST,DEBUG,PUT,DELETE" type="System.Web.UI.SimpleHandlerFactory" resourceType="Unspecified" requireAccess="Write" preCondition="integratedMode"/>
<add name="SimpleHandlerFactory-Integrated-4.0" path="*.ashx" verb="GET,HEAD,POST,DEBUG,PUT,DELETE" type="System.Web.UI.SimpleHandlerFactory" resourceType="Unspecified" requireAccess="Write" preCondition="integratedMode,runtimeVersionv4.0"/>
<add name="SimpleHandlerFactory-ISAPI-2.0" path="*.ashx" verb="GET,HEAD,POST,DEBUG,PUT,DELETE" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v2.0.50727\aspnet_isapi.dll" resourceType="Unspecified" requireAccess="Script" preCondition="classicMode,runtimeVersionv2.0,bitness32" responseBufferLimit="0"/>
<add name="StaticFile" path="*" verb="GET,HEAD,POST,DEBUG,PUT,DELETE" modules="StaticFileModule,DefaultDocumentModule,DirectoryListingModule" resourceType="Either" requireAccess="Read"/>
</handlers>
<security>
<authorization>
<remove users="*" roles="" verbs=""/>
<add accessType="Allow" users="*" verbs="GET,HEAD,POST,PUT,DELETE,DEBUG"/>
</authorization>
</security>
</system.webServer>
</configuration>

3- The core of the handler code inside FileUploadHandler.ashx:


public void ProcessRequest(HttpContext context)
{
//context.Response.ContentType = "text/plain";
//context.Response.Write("Hello World");

// Read input
string requestContent = new StreamReader(context.Request.InputStream).ReadToEnd();
if (string.IsNullOrWhiteSpace(requestContent))
{
context.Response.Write("");
return;
}

string[] requestArray = requestContent.Split(new[] { "--ILikeSeperator" }, StringSplitOptions.RemoveEmptyEntries);

if (requestArray.Count() > 0)
{
string fileContent = GetContent(requestArray[0]);

if (!string.IsNullOrWhiteSpace(fileContent))
{
// Send back response to client
context.Response.Write(fileContent);

// Create upload file
CreateUploadedFile(fileContent);
}
}
}

4 – IIS Setup: Add new application, use default authentication

Ashx IIS Setup

5 – Deploy the Ashx handler to upload directory (Created from AspxHandler project).

Remember use Web.config given above.

Ashx_Handler_Folder_Setup

6 – Set folder permission in uploadTest directory. Allow write permission for IIS_IUSRS (This is built-in IIS user) so handler able to create new folder and files.

Ashx_Handler_IIS_IUSRS_Write_Permission

You will get errors in client and server if no write permission is allow in mapped directory of the url:

Client error:

System.Net.WebException was unhandled
  Message=The remote server returned an error: (500) Internal Server Error.

Error in client code

Server Error:

System.UnauthorizedAccessException was unhandled by user code
  Message=Access to the path ‘C:\inetpub\wwwroot\uploadTest\MyUploadContents\’ is denied.

Error in Server code

Now DONE!

Enjoy your customize handler just for the url you want!

Next post will talks about the debugging in ashx handler, a simple and short article 😉

Sample source code:

————-

Keywords:

Customize url handler, file upload handler, file upload ashx, iis handler, HttpWebRequest

References:

WPF Performance – General

Deal with Performance in WPF applications

This article tells the basic thread structure of WPF (which I thinks is important for me right now as I need to know that for the WPF performance tuning), some tricks and basic concepts of WPF design.

Good article (I said that because probably I can understand them now after some time :P, also if the article can explain in more simpler way when compare to Microsoft documents)

Try to follow WPF design concept to have a best performance (MVVM, Display UI on the fly,…)

Next post will be some technical findings when I works on WPF performance.

A Good Post to Read About WPF, Read the Comments as well !

I receive this article from codeproject email, and…. I got the same feeling as well because the WPF is the hardest part to pick up in my current project!

Six years of WPF; what’s changed?

I only have 20 months + experience in WPF so no comment on the revolutions of WPF, but please take some time to read the comments below, it is worth to read them.

The project file {0} has been moved, renamed or is not on your computer

I face similar issue described in this post:

The project file * has been moved, renamed or is not on your computer

I am using VS2010. I have one project not recognize in solution (Unloaded and grey out), when edit the .sln file notices there are unmatched entries:

SccProjectUniqueName102 = CorrectPath\\Modules\\MyProject.csproj

SccProjectName102 = WrongPath/MyProject
SccLocalPath102 = WrongPath\\MyProject

Most of the answers on the internet tell you to delete the .suo file so you will get rid of it, I have tried but no luck, end up I decides to correct the paths manually in .sln file, like this:

Step 1/2

SccProjectUniqueName102 = CorrectPath\\Modules\\MyPorject.csproj

SccProjectName102 = CorrectPath/Modules/MyProject
SccLocalPath102 = CorrectPath\\Modules\\MyProject

Save the changes and open the solution again, Visual Studio still prompt me a warning said the ‘MyProject’ failed to load.

Step 2/2
Ok, it seems I should try the most popular solution, delete .suo …

Open solution again, and ….. No error/warning message given!

Pheeew, solved it at last.

Reminder:

You will lose your Visual Studio user settings by deleting the .suo file, like breakpoints, opened tabs, expanded/collapsed tree nodes, etc.

Keywords: .suo, .sln, Visual Studio 2010 Solution, Setting

References:

  1. The project file * has been moved, renamed or is not on your computer
  2. Hack the Project and Solution Files