Thursday, September 29, 2011

CAPICOM: Keyset does not exist

Recently I have been trying to port a classic ASP application to ASP.Net. The major thing to do was to keep using CAPICOM for encryption. The reason was that the data we encrypt goes to a 3rd party vendor who decrypts them using CAPICOM and they were not going to change their side of the program.

Two specific problems that I encountered whenever deploying my application to servers.
a.) Retrieving the COM class factory for component with CLSID {94AFFFCC-6C05-4814-B123-A941105AA77F} failed due to the following error: 80040154
This I could resolve by registering the CAPICOM dll on the server (regsvr32). I was assuming that this would not be necessary given that I have a .Net wrapper around the CAPICOM dll (using tlbimp. MSDN).

b.) Keyset does not exist
Searching on Bing/Google led me to several sites saying it's permission issue on the Machine Keys folder. I tried setting permission for all users I could think of: ASPNet, IUSR, IWAM, Service Account. But this did not help. Then I imported the certificate from the old machine where classic ASP application is running and voila! the encryption algorithm started working. I removed all permission settings for the ASP.Net users mentioned before and it still worked.
I am not sure why this is!

Wednesday, September 28, 2011

Surface Area Configuration: Computer localhost does not exist on the network, or the computer cannot be configured remotely

I was trying to connect to a local instance of SQL Server from a Dev app server. The application would fail saying
A connection was successfully established with the server, but then an error occurred during the pre-login handshake. When connecting to SQL Server 2005, this failure may be caused by the fact that under the default settings SQL Server does not allow remote connections. (provider: Named Pipes Provider, error: 0 - No process is on the other end of the pipe.)
So I brought up the SQL Server Surface Area Configuration tool (Programs> SQL Server 2005> Configuration Tools >SQL Server Surface Area Configuration) and clicked on Surface Area Configuration for Services and Connections. And this will throw an error:
TITLE: Surface Area Configuration ------------------------------ Computer localhost does not exist on the network, or the computer cannot be configured remotely. Verify that the remote computer has the required Windows Management Instrumentation components and then try again. (SQLSAC) ------------------------------ ADDITIONAL INFORMATION: An exception occurred in SMO while trying to manage a service. (Microsoft.SqlServer.Smo) For help, click: http://go.microsoft.com/fwlink?ProdName=Microsoft+SQL+Server&ProdVer=9.00.3042.00&EvtSrc=Microsoft.SqlServer.Management.Smo.ExceptionTemplates.InnerWmiException&LinkId=20476 ------------------------------ Failed to retrieve data for this request. (Microsoft.SqlServer.SmoEnum) For help, click: http://go.microsoft.com/fwlink?ProdName=Microsoft+SQL+Server&LinkId=20476 ------------------------------ Invalid class (System.Management) ------------------------------ BUTTONS: OK ------------------------------
While searching for a solution I came across this blog http://blogs.msdn.com/b/echarran/archive/2006/01/03/509061.aspx. Ran the command as mentioned there and I was able to bring up the Surface Area Configuration tool.

Thursday, September 8, 2011

Interdev connection failed: Method not allowed(Error code = 80070005)

I was recently re-writing a classic ASP web application into .Net. So I was trying to create a web project in Visual Studio InterDev when I got this error. My environment: XP SP2, IIS 6. Resolution: I did not have Microsoft FrontPage extensions installed. To check a.) go to Control Panel > Add Remove Programs > Add Remove Windows Component b.) Select Internet Information Services (IIS) c.) Click Details and ensure FrontPage 2000 Server Extensions option is checked. If not, check it and click OK. That did it for me and may help you too.

Tuesday, July 19, 2011

Case Insensitive Replace() function

For some reason .Net framework does not have the case insensitive replace method in the String class. I found it can very easily be implemented for String class using Extension Method feature of .Net.

Here's the method:
public static string Replace(this string originalString, string oldValue, string newValue, StringComparison comparisonType)
{
int startIndex = 0;
while (true)
{
startIndex = originalString.IndexOf(oldValue, startIndex, comparisonType);
if (startIndex == -1)
break;

originalString = originalString.Substring(0, startIndex) + newValue + originalString.Substring(startIndex + oldValue.Length);

startIndex += newValue.Length;
}

return originalString;
}


And calling this method seems trivial:
originalString = originalString.Replace(@"ABCD", "abcd", StringComparison.InvariantCultureIgnoreCase);


That's it.

Monday, July 18, 2011

CSS Refresh issue in Firefox

While developing a website in ASP.Net I noticed that my CSS file was not immediately refreshed in Firefox and until I noticed; it caused me to think that the CSS I was trying is not correct. Ctrl+F5; Ctrl+R etc does not work.

I found modifying the entry in config did the trick for me:
network.http.use-cache = false


But I believe it should not be that you have to modify config file for the new CSS to load into the browser. But for now this works.

Monday, June 27, 2011

Metadata contains a reference that cannot be resolved

While adding a service reference to my project, I started getting an error

The HTML document does not contain Web service discovery information.
Metadata contains a reference that cannot be resolved: 'http://localhost/IDM.ProVue.DAWS/WS_Results.svc'.
Content Type application/soap+xml; charset=utf-8 was not supported by service http://localhost/IDM.ProVue.DAWS/WS_Results.svc. The client and service bindings may be mismatched.
The remote server returned an error: (415) Cannot process the message because the content type 'application/soap+xml; charset=utf-8' was not the expected type 'text/xml; charset=utf-8'..
If the service is defined in the current solution, try building the solution and adding the service reference again.


I had added other service references without issues and was having a bit of trouble finding out what the problem is. The suggestions given in browser (if you try to browse from IIS Manager) were about setting httpGetEnabled to true. So I checked in the web.config of my service site and found it was set to true.

When I opened the WCF config editor (my preferred way of modifying service site web config) I saw that the "Behavior Configuration" value for the the service was not set. Selecting the right behavior from the drop down was all that I needed to do.

Wednesday, June 22, 2011

Dundas Chart and AJAX Calendar control overlap issue

The layout of my webpage (an ASP.Net content page) was:
Date Picker
Dundas Chart

The page displayed fine but if you click on the calendar image button of the calendar control, the view that pops up is rendered behind the chart control. This was happening in Chrome, FF & IE.

I found a discussion on Dundas support forum: http://support2.dundas.com/forum/tm.aspx?m=6100&mpage=1&key=&
Even after overriding the style class (.ajax__calendar or ajax__calendar_container) in my .css file I could not get the calendar to show up on top of the dundas chart.

and the thing that worked for me was putting the style in the .ascx file
<*style type="text/css">
.ajax__calendar_container { z-index : 1000 ; }
<*/style>
I am still not sure why this happens, but that's what worked for now. If I get a satisfactory explanation I'll post here.

Thursday, February 24, 2011

System.UnauthorizedAccessException: Access to the path is denied

During my recent deployment to a QA box, one of the functionalities "Upload File" of the web app would not work.

Here is what I had done. During development I observed that the file upload would work when I was running the app in Debug mode, from within Visual Studio. When I tried running the app from virtual directory (as in http://localhost/MyApp/Upload.aspx) the file upload would fail with "Logon failure: unknown user name or bad password", about which I blogged a while ago. And hence I added the code to impersonate the current logged in user. And it worked fine.

However, the same impersonation code would not work when the app was deployed on the server. Another thing I should point out is, the file copy is happening on a server different from the app server. When I commented out the impersonation code, it started working. I am still not sure why it so happened.


Windows authentication for an NT group

Recently I implemented authentication system where the logged in user has to be part of the company domain (handled by IIS) and should belong to an app specific NT group. The code used was simple
foreach (System.Security.Principal.IdentityReference group in currentContext.Request.LogonUserIdentity.Groups)
{
groupName = group.Translate(typeof(System.Security.Principal.NTAccount)).ToString();
if (groupName.Equals(userGroup, StringComparison.InvariantCultureIgnoreCase))
{
userIsInGroup = true;
break;
}
}

It worked fine on development machine, but would redirect me to access denied page on the QA server.

After logging the current context user in app (during security check) I found the web app was running under the admin account. And the admin account was not part of my app NT group. The reason this was happening was because Windows explorer cached the admin account credentials, that I use for copying the published files on the server.

To clear the cache, I had to run the following from command prompt:
rundll32.exe keymgr.dll, KRShowKeyMgr
This brings up a UI that has all the server names for which Windows explorer has cached the credentials. Select the server and click on "Remove" and that should do the trick.

Thursday, February 3, 2011

Multiple group headers in BOXI Crystal reports

Yesterday I just found an interesting issue with Crystal Reports XI.
We had a report where in we had to place 5 group headers. After applying all the options what we observed was that the group headers would appear multiple times whenever the group values changed. Searched a lot for answers but to no avail. We're working on it and I'll post the solution as well once we get it.
Workaround::
The solution to this kind of issue is that we should put the different grouping fields in different group header and suppress those groups. Whatever values are to be shown on the report needs to go in the last group header whose corresponding Group Footer has the New Page After property set. This resolves the issue.