Friday, 6 November 2009
Service factory
Thursday, 19 March 2009
Accessing TFS programmatically result in a Common Language Runtime detected an invalid program.
I have written a small application which access TFS programmatically to carry out certain operation (I won’t go in detail about the application, everything worked fine on my local machine but when I deployed this application onto SYST Environment, my really sweet application was throwing following error (haven’t included the stacktrace though).
Error Details: InvalidProgramException: Common Language Runtime detected an invalid program.
Reading thru some of the forums indicated one of the possibility of this might be if server is running 64 Bit. In my case this was not a problem as my server is 32 bit. I was able to resolve this issue by installing VS2008TeamExplorer on the server. Not sure how this makes a difference as all required dll’s for accessing TFS programmatically is included in the BIN directory of application. If any of you have any further info on these lines please leave a comment.
Friday, 20 February 2009
Unable to start debugging on the web server. An authentication error occurred while communicating with the web server. Please see Help for assistance
when I was trying to debug a website with host header, was getting an authentication error message, after much of googleing I couldn’t find a solution to this problem until one of my colleague pointed me to the MSDN Blog where Joe Cartano has blogged about this solution. He also explains the cause for this problem. Click here( Visual Web Developer Team Blog ) to go this blog
Tuesday, 10 February 2009
Validate XML with XSD in .Net 3.5
In days on .Net 2.0, its was not straight forward to validate and XML with XSD. We were doing lot of coding playing around with XmlTextReader and XmlValidatingReader. Thanks to .Net 3.5 where majority of the functionality is provided by the XMLDocument itself. Below is the piece of code to validate and XML document against XSD.
Below is the event handler to handle the validation event, we need to add this to the event handler collection, this becomes the input parameter for validate function.
protected void ValidationHandler(object sender,
ValidationEventArgs args)
{
// code you want to execute when validation error/warning is raised
ErrorMessage += "
" + args.Message + "\r\n";
ErrorsCount++;
}
Below is the code snippet to validate the xml against XSD, below snippet assumes that XSD file resides in the same folder as XML.
XmlDocument xx = new XmlDocument();
xx.Load(xmlFilePath);
xx.Schemas.Add("",Path.Combine(Path.GetDirectoryName(xmlFilePath),
"ConfigurationSchema.xsd"));
// create an eventhandler with function coded above
ValidationEventHandler eventHandler = new ValidationEventHandler(ValidationHandler);
//Validate the XML
xx.Validate(eventHandler);
validation event is raised for every error/waring while validating, so you can process each error message separately as required
Friday, 30 January 2009
Execute Powershell programmatically in C#
Last week I was working on a piece of functionality where I wanted to execute powershell script programmatically. Here is the piece of code for this.
Namespaces to include:
using System.Management.Automation.Runspaces;
using System.Management.Automation;
using System.Collections.ObjectModel;
using System.Collections;
using System.Collections.Generic
This function takes following arguments
· ps1Filename – Poweshell script to excute (full file path)
· WebsiteRootPath, WebsiteURL, ServerEnvironment – these are custom arguments for my powershell (you can replace this with what arguments your ps1 is expecting)
Function:
private string ExecutePowershell( string ps1Filename, string WebsiteRootPath,string WebsiteURL,
string ServerEnvironment)
{
Runspace runspace = RunspaceFactory.CreateRunspace();
runspace.Open();
Pipeline pipeline = runspace.CreatePipeline();
//create command with script path
Command c = new Command(ps1Filename, false);
c.Parameters.Add(new CommandParameter("destinationFolder", WebsiteRootPath));
c.Parameters.Add(new CommandParameter("baseUrl", WebsiteURL));
c.Parameters.Add(new CommandParameter("env", ServerEnvironment));
pipeline.Commands.Add(c);
//create a collection to hold output of script
Collection<PSObject> results = new Collection<PSObject>();
try
{
// execute the script
results = pipeline.Invoke();
}
catch (Exception ex)
{
results.Add(new PSObject((object)ex.Message));
}
runspace.Close();
StringBuilder stringBuilder = new StringBuilder();
//loopthru all the objects returned (each object will contain output text)
foreach (PSObject obj in results)
{
stringBuilder.AppendLine(obj.ToString());
}
return stringBuilder.ToString();
Create webservice proxy at runtime in c#
using System;
using System.Collections.Generic;
using System.Text;
using System.Reflection;
using System.CodeDom;
using System.CodeDom.Compiler;
using System.Security.Permissions;
using System.Web.Services.Description;
namespace ConnectionLib
{
public class WSProxy
{
[SecurityPermissionAttribute(SecurityAction.Demand, Unrestricted = true)]
public static object CallWebService(string webServiceAsmxUrl, string serviceName, string methodName, object[] args)
{
System.Net.WebClient client = new System.Net.WebClient();
// Connect To the web service
System.IO.Stream stream = client.OpenRead(webServiceAsmxUrl + "?wsdl");
// Now read the WSDL file describing a service.
ServiceDescription description = ServiceDescription.Read(stream);
///// LOAD THE DOM /////////
// Initialize a service description importer.
ServiceDescriptionImporter importer = new ServiceDescriptionImporter();
importer.ProtocolName = "Soap12"; // Use SOAP 1.2.
importer.AddServiceDescription(description, null, null);
// Generate a proxy client.
importer.Style = ServiceDescriptionImportStyle.Client;
// Generate properties to represent primitive values.
importer.CodeGenerationOptions = System.Xml.Serialization.CodeGenerationOptions.GenerateProperties;
// Initialize a Code-DOM tree into which we will import the service.
CodeNamespace nmspace = new CodeNamespace();
CodeCompileUnit unit1 = new CodeCompileUnit();
unit1.Namespaces.Add(nmspace);
// Import the service into the Code-DOM tree. This creates proxy code that uses the service.
ServiceDescriptionImportWarnings warning = importer.Import(nmspace, unit1);
if (warning == 0) // If zero then we are good to go
{
// Generate the proxy code
CodeDomProvider provider1 = CodeDomProvider.CreateProvider("CSharp");
// Compile the assembly proxy with the appropriate references
string[] assemblyReferences = new string[5] { "System.dll", "System.Web.Services.dll", "System.Web.dll", "System.Xml.dll", "System.Data.dll" };
CompilerParameters parms = new CompilerParameters(assemblyReferences);
CompilerResults results = provider1.CompileAssemblyFromDom(parms, unit1);
// Check For Errors
if (results.Errors.Count > 0)
{
foreach (CompilerError oops in results.Errors)
{
System.Diagnostics.Debug.WriteLine("========Compiler error============");
System.Diagnostics.Debug.WriteLine(oops.ErrorText);
}
throw new System.Exception("Compile Error Occured calling webservice. Check Debug ouput window.");
}
// Finally, Invoke the web service method
object wsvcClass = results.CompiledAssembly.CreateInstance(serviceName);
MethodInfo mi = wsvcClass.GetType().GetMethod(methodName);
return mi.Invoke(wsvcClass, args);
}
else
{
return null;
}
}
}