>
 Tuesday, June 21, 2005

It's just not enough to play with a technology...you really have to burn a few wasteful hours on something ridiculous before you can really feel the love. I love Indigo, I hate that I just spent 3 hours on what I'm about to describe to you. I hope that these 3 hours are well spent if it saves one of my 4 readers the trouble on the road to Indigo...

I have this relatively complex service I am working on that implements contracts for the WS-Trust and WS-Transfer specification (more on those another time...but you get the idea, lots going on). And since I'm implementing a standard contract, I don't need to create a proxy for the client, instead the client can dynamically create a channel to access the service, binding to the same IWSTransfer or IWSTrust contract definition (interface-based). I was a little bit curious how this would play out, what little steps I might miss getting the client side channel properly configured, exposing the service endpoint correctly since it has multiple contracts...so I expected trouble when I first ran the client code to hit the service.

First, my client started getting Access Denied errors hitting the service. This was easy enough, I had to tweak a few things on my service directory permissions.

Second, and less obvious, I start getting the hideous “Internal Server Error 500“. So begins my trials to find the cause, without really knowing “what I don't know yet” about Indigo.

The saga begins...

1. I run the service in the browser, and I get this strange error that indicates it can't find the service DLL.

<%@Service language=c# Debug="true" class="IDesign.Samples.Indigo.WSTransferService" %>
<%@Assembly Name="Service" %>

I check, Service.dll exists, everything built fine, so I test another service that I know works, and no problems showing it the browser.

2. Could it be that my complex interfaces are causing a problem? I am after all exposing two contracts, perhaps I missed something?

So I simplify, and copy a test service that I know works, into my WSTransferService' project, and I modify the configs to expose only that service just to check it out. I use the same test client to hit this test service, simply reconfigure the endpoint from http://localhost/vdiroriginal/service.svc to http://localhost/vdirnew/service.svc. IT DOESN“T WORK! So, now, what am I to think? Same error, different project, different virtual directory. Hmmm...

3. Could it be the Virtual Directory settings?

I check IIS, compare them, I find my service doesn't have “Scripts and Execution“ enabled, so I'm thinking EURIKA, I'VE FOUND IT! No go, same error, damn!

So I use the same Virtual Directory and instead redirect it to another physical directory, and use the same simple test client, and I simply swamp the test client configuration from the service it normally hits, to the same service in a different directory. That means the test client configuration is the same, the test service configuration is the same, but the location is in a new physical directory. Still, no go.

4. Could it be some project settings?

I check the project settings, they are identical, so there is no special post build step that could lead to the error.

I know what you're thinking, “What was the freaking solution then??? Why tell me all of this crap???”.  Answer: Well, just to give you an idea of the other possible things you might need to check for other service issues...even if they don't apply to this one. I'm almost there...check it out...

5. Project settings, project settings, project settings...and then it hit me...

The service DLL, you know the one it said in #1 above “can't be found“. Yeah, well the error message couldn't be more clear now could it? The problem is, when you create an Indigo service, you usually create a class library and add the .svc and related code there. If you deploy the service, you deploy as follows:

\root

   service.svc

   web.config

\root\bin

   service.dll

Yeah, well class libraries default to build the DLL in the \debug or \release folder right? Now you feel my 3 hours of pain. I doubted myself, and I shouldn't have. I was sure it was a problem with one of: directory access, virtual directory settings, service configuration errors...or some magical thing I just don't get about hosting in IIS.

NOT

I had to change my project settings to build the output files in \bin instead of \bin\debug or \bin\release.

Had I deployed the app, of course I would have used the correct structure...but I was testing from within the IDE...and that my friends is my first official ghost chase with Indigo. Stupid? Yes. Could it happen to you? Not anymore.

 

6/21/2005 11:12 PM Indigo  | Comments [2]  |  View reactions  |  Trackback
 Monday, June 13, 2005

Last month Pat Phillips of MainFunction interviewed me about my career. Her goal: to educate high school teachers about careers possibilities in technology.

https://www.mainfunction.com/patp/blog/archive/2005/06/10/120.aspx

It seems like the MainFunction site is primarily devoted to providing resources for educators, which is fantastic. I had no idea what kind of opportunities awaited me when I was in high school, and my choices in university were completely by “fluke” as I transitioned from Finance to Computer Science. I think that high school students and parents need help to paint the broader picture of what a career in technology means today. It's not just a desk job behind closed doors. It can mean any of the following and more:

  • Software quality assurance
  • Software development
  • IT
  • Team lead or management
  • VP Engineering, CTO, CIO
  • Independent consulting
  • Speaking, writing, training
  • Blogging

Think about it, since more and more people are blogging, writing articles for online resource sites, participating in local community groups - they are gaining a ton of career satisfaction because they are recognized not only in their day to day job (at least hopefully) but also publicly. This does wonders for a young adult's self esteem, as they get started in their career...and frankly these are activities even high school and university students (heck, grade schoolers probably blog too!!!) can get involved in early.

Spread the word if you know any teachers, let's give the next generation some great ideas about where their career can go if they take the red pill. 

6/13/2005 3:01 PM Speaking/Events  | Comments [1]  |  View reactions  |  Trackback

Lately I've been writing a lot of silly batch files to automate things like Indigo service proxy generation...and I recently saw my friend Christian Weyer's blog reference this tool, which is just what the doctor ordered:

http://weblogs.asp.net/pgreborio/archive/2005/06/07/410662.aspx

 

6/13/2005 2:27 PM Cool Tools | Indigo  | Comments [0]  |  View reactions  |  Trackback
 Saturday, June 11, 2005

In this talk I discussed the new features of localization in ASP.NET 2.0 including:

·        Web Forms resource generator

·        Localization expressions

·        Strongly-typed resources

·        Improved Resource Editor

·        ResourceManager lifetime management

·        Automatic culture selection

·        New Microsoft ASP.NET deployment options

·        New resource provider model

 

The sample I demonstrated showed a simple progression of feature implementation, and you can download that here:

 LocalizeASPNET20codeV2.zip (3.21 MB)

 

In fact, this sample is related to the MSDN article that I updated already to reflect Beta2, and one of these days soon they should post my updated article to the following link:

http://msdn.microsoft.com/asp.net/community/authors/mlb/default.aspx?pull=/library/en-us/dnvs05/html/asp2local.asp

 

I also have a more advanced sample, that includes the use of a localized database, the membership provider, profile and themes in 2.0, caching architecture, and more. This sample is available from this blog post:

 

http://www.dasblonde.net/PermaLink.aspx?guid=f8b330d8-0a87-496c-8be3-3aff101bfd58

 

And of course I have some other resources for your interest…

 

Michele’s Globalization Site: http://www.dotnetdashboard.net/sessions/globalization.aspx

Localization Partner Program:

http://www.vsippartners.com/programs/localization

General guidelines on internationalization:
http://www.microsoft.com/globaldev

 

6/11/2005 7:45 PM ASP.NET | Globalization | Speaking/Events  | Comments [6]  |  View reactions  |  Trackback

Thanks very much to everyone who attended this talk in Orlando. The demonstration code can be found here:

 

WSESecurityDemo_MemberRoles.zip

 

You’ll also notice that there is some set up required to run the code, so be sure and review the readme document for those instructions. The sample uses the 1.1 version of the MemberRoles API.

 

I also have a resource site where other WSE samples have been posted, many that do not require the database setup:

 

http://www.dotnetdashboard.net/resources/wse.aspx

 

This may help those of you that are newer to the subject get your arms around it as well.

6/11/2005 7:27 PM Speaking/Events | Web Services | WSE  | Comments [2]  |  View reactions  |  Trackback

In this talk I took an application that was built for 1.1, with migration in mind. And demonstrated its migration to 2.0. The “before” sample can be found in this blog post:

http://www.dasblonde.net/PermaLink.aspx?guid=9a3d226f-91a0-461f-af97-530488b0f7e2

 

 

The “after” sample with a 2.0 version of the same application, can be found here:

GalleryDemo20.zip (1.88 MB)

 

Other resources:

         My MSDN Whidbey Articles

        http://msdn.microsoft.com/asp.net/community/authors/mlb/default.aspx

         ASP.NET Whidbey Team Resources & Book

        http://www.asp.net/whidbey

         ASP.NET Forum

        http://www.asp.net/forums

 

In this talk I presented approaches to the following key areas for a professionally designed ASP.NET application:

 

  1. Page Design & Navigation
  2. Error Handling
  3. Data Access
  4. Caching
  5. Localization
  6. Configuration & State Management
  7. Role-based Security
  8. Reduce Attack Surface
  9. Protect Sensitive Data
  10. Component Design & Deployment

 

The code sample that implements many of the concepts I discussed can be found here:

GalleryDemos2003_2.0 Migration.zip (1.44 MB)

 

In fact, this is the “before” code sample that I later use to migrate to 2.0 in my migration talk. So, if you looking at designing 1.1 applications for migration you’ll like some of my approaches here.

 

Other resources:

         My MSDN Whidbey Articles

        http://msdn.microsoft.com/asp.net/community/authors/mlb/default.aspx

         ASP.NET Whidbey Team Resources & Book

        http://www.asp.net/whidbey

         ASP.NET Forum

        http://www.asp.net/forums

6/11/2005 7:21 PM ASP.NET | Speaking/Events  | Comments [7]  |  View reactions  |  Trackback

In this talk I demonstrated the following WSE 2.0 example for WS-Security implementation, followed by a demonstration of .NET and BEA interoperability. The BEA interoperability sample is available from the InteropWarriors site, however keep in mind that this requires you to set up a BEA Workshop 8.1 machine, and deploy the project files accordingly. The .NET examples shows the end to end code used for WS-Security that is also demonstrated with Workshop sandwiched in the middle, so this will still be useful to you for the .NET perspective.

 

WSESecurityDemo_MemberRoles.zip

 

I also have a resource site where other WSE samples have been posted, many that do not require the database setup:

 

http://www.dotnetdashboard.net/resources/wse.aspx

 

This may help those of you that are newer to the subject get your arms around it as well.

6/11/2005 7:18 PM Speaking/Events | Web Services | WSE  | Comments [0]  |  View reactions  |  Trackback

In this talk I walked through the progression of migrating ASP.NET application component architecture from in process to out of process Enterprise Service components. The code sample can be found here:

 

ASPNETScalability_ES.zip (3.64 MB)

 

I also have some other resource pages related to the topics discussed:

        http://www.dotnetdashboard.net/sessions/handlers.aspx

        http://www.dotnetdashboard.net/sessions/soapext.aspx

        http://www.dotnetdashboard.net/resources/scalability.aspx

6/11/2005 7:15 PM Architecture | ASP.NET | Speaking/Events  | Comments [1]  |  View reactions  |  Trackback
In this rather lengthy post I cover the issues I encountered incorporating the MemberRoles API for 1.1 with a WSE 2.0 service. The issues are related to storing hashed passwords in the database, handling that on the server side with WSE’s UsernameTokenManager, and how to work around limitations of the API that prevented me from easily retrieving hashed passwords and generating a hashed version of the UsernameToken for WSE to compare.
6/11/2005 7:13 PM Web Services | WSE  | Comments [1]  |  View reactions  |  Trackback

This API has been recently updated and posted here:

http://www.asp.net/memberroles/memberroles.htm

 

You’ll notice that the license has been updated to be slightly less restrictive from the original post. Now you can continue using the 1.1 API on production for 3 months after the release of ASP.NET 2.0, which we expect to be later this year. This is still somewhate limiting, because it presumes you have a go-live plan so soon after the release that you may as well be going live today with Beta 2. I’m not sure if the license will change again, so I encourage you to read the license in the download, when you download it…to confirm my statements are still accurate. For what it is worth, my sample code will demonstrate how to put it to use with 1.1.

6/11/2005 7:10 PM ASP.NET | ASP.NET 2.0 Migration  | Comments [3]  |  View reactions  |  Trackback
 Friday, June 03, 2005

Just to let those who attended my talks in Amsterdam this week at SDC, I will be posting the links and samples for each talk by the end of this weekend...right now I'm getting ready to leave town for Tech Ed in Orlando...but I have not forgotten you!

6/3/2005 11:05 AM Speaking/Events  | Comments [4]  |  View reactions  |  Trackback
 Friday, May 20, 2005

With all of the new product launches forthcoming...things are starting to get muddy...and I found this excellent post from Rob Caron that at least makes a good start for understanding the tiers and relationships between the Express, Visual Studio and Visual Studio Team System products. These are a must read:

http://blogs.msdn.com/robcaron/archive/2005/04/15/408426.aspx

http://blogs.msdn.com/robcaron/archive/2005/04/20/410207.aspx

But, be prepared that there are still many unanswered questions regarding pricing for VSTS and how it fits with existing partner programs and MSDN subscriptions. Microsoft is still working on this story, based on feedback from the business community, so you should stay tuned for more information from Microsoft in the June/July timeframe to provide clarity.

 

5/20/2005 8:35 AM VSTS  | Comments [1]  |  View reactions  |  Trackback
 Friday, May 13, 2005

My latest globalization article is now live on The Server Side .NET, and I'm working on some new code samples for 2.0, for my upcoming talks at Tech Ed, so stay tuned for more updates on my globalization resource pages!

http://www.theserverside.net/articles/showarticle.tss?id=LocalizationPractices

5/13/2005 9:03 PM .NET | Globalization  | Comments [20]  |  View reactions  |  Trackback

I recently received this question at SearchWebService.com...

 

How can I call a Web page from my Web service page after extracting an XML file into a dataset? My Web page will display data from a created dataset into a DataGrid control. Can I return data directly into a Web service page using Visual Studio .NET?

 

Probably because I have had to go through some interesting integration patterns in the past, I answered the question with two flavors...discussions welcome.

 

Here's my answer:

 

I think the best way to tackle your question is to review the workflow between client, Web service and Web application (pages). If the client application is the Web application, then the workflow looks something like this:

1. User browses to a page.

2. During the Page.Load event you invoke a Web service to get the dataset, before binding that dataset response to a DataGrid control on the Web page.

3. The page is returned to the browser with the populated DataGrid rendered as HTML.

 

The call chain looks like this:

Browser->Web Page->Web Service

 

What may be misleading about your question is the statement “call a Web page from my Web service”. Web services are data centric calls. They do not return HTML that can be displayed in a browser, therefore they should not be responsible for “calling” a Web page. Rather, the Web page should call the Web service to gather data, and present it. The driver behind the activity is the user who navigates to a page that leverages the service.

 

That said there is another possibility that can be interesting. Consider this workflow:

  1. User interacts with a Windows client application.
  2. The application at some point invokes a Web service to gather data from a remote server. The Web service establishes a session for the caller, and allocates the dataset to the session. The Web service returns XML that includes a link to a Web page exposed by the same server.
  3. The client application retrieves the XML response, which includes a URL to a Web page to navigate to (with session established) and the client application launches a browser (or, has an embedded custom browser) to the URL.
  4. The requested URL (page) retrieves the dataset from the session object, and displays the page fully populated.

So, the call chain is now:

Windows App->Web Service

Windows App -> Browser -> Web Page

 

This type of workflow may seem disconnected, however it is one technique whereby a legacy application can integrate with a modern user interface (through the browser) when the legacy app wants to integrate the modern application’s services as part of a user interface workflow, in addition to data exchange. For example, the insurance industry has many legacy agency management system applications, some even DOS-based entry screens, that “work” therefore will not be replaced. These agency management systems hold important data necessary to create certificates of insurance, a service often provided by external, modern applications. These modern vendor applications rely on data from the agency management system to function, therefore a data exchange must be automated as part of the workflow, enabling the modern application interface to pick up where the legacy system left off, and finish the job.

 

 

 

5/13/2005 5:04 PM .NET | Web Services  | Comments [5]  |  View reactions  |  Trackback
 Monday, May 09, 2005

What a great turnout for the .NET conference in Long Beach last Saturday! I was amazed at how many faced I recognized from San Diego, Orange County and LA!!!

Anyhow, my slide deck for the presentation is here as promised:smartclient_ocevent1.zip (412.28 KB)

I'll update this blog post tonight with the code sample. Just cleaning up some things that I had converted for Beta 2. Stay tuned!

Updated 05/09/05 - code sample from demo:ClickOnceDemos.zip (368.13 KB)

5/9/2005 7:08 PM .NET | Smart Client | Speaking/Events  | Comments [0]  |  View reactions  |  Trackback
 Sunday, May 08, 2005

Ok, I noticed a few other little things about the publishing process through Visual Studio 2005, related to Beta 2. So, in an effort to save you all the 45 minutes I wasted on some of these things, here's the list. Luckily, I was somewhat aprised of this before I did my presentation yesterday, however, it still ate up some demo time given that things didn't always work the first time...

1. Publishing will continue even if you can't successfully build (see my previous post), so I recommend you always try to build first and watch your output. I know what you are thinking: “Oh, I'll just publish and check the output window for errors before I run the app”. But, I guarantee you will be sometimes seduced by that little browser window with the “Install” button...and you'll forget...and you'll find a bug...and you'll try to think about what the problem is but really you didn't get the latest assembly (or, worse, the assembly you're referencing never was built).

2. The “Properties” tab doesn't appear to be saved as part of the build step. So, if you make changes they won't be reflected when you publish...another ghost. The problem is, it still increments the published version, so you “think“ you have it.

3. Sometimes, not always, if you don't version your assemblies, the updated code is not deployed with the newly published version. This problem seems strange to me, since the published application version has been incremented...however I haven't had time yet to inspect what the cause of this is, in terms of the server deployment and its files.

If I see any more problems, or find a solution for these issues...I'll update this post. Feel free to comment if you find it before I do, I'm about to bury myself in ASP.NET 2.0 and Indigo for the next few weeks, I won't have much time for ClickOnce...

 

5/8/2005 4:46 PM .NET | ClickOnce  | Comments [2]  |  View reactions  |  Trackback
    ON THIS PAGE
    SEARCH
    CATEGORIES