Feeds:
Posts
Comments

When you are familiair with the WebService Software Factory (WSSF) you probably know that this tool uses three kind of models to make developing services much easier:

  • DataContractModel
  • ServiceContractModel
  • HostModel

In this post I would like to focus on the ServiceContractModel. This model generates messagecontracts and a servicecontracts. The servicecontract looks like a normal  interface where signatures of methods are defined. The only difference is that a servicecontract also contains two kind of attributes:

The properties of both attributes can be modified with the designer of WSSF. One drawback of WSSF is that it’s not possbile to add more attributes to the servicecontract. When you want to build a transactional WCF service with WSSF you have to do some coding by yourself. This isn’t a problem, but the combination of writing your own code and generate code with WSSF could become a problem if you not doing it right.

There are a couple of steps you need to take before your service is supporting transactions. For a guide step by step take a look here. In this post I will only talk about how you should decorate your interface and how to do this with WSSF. In your interface you are able to determine which operation could join or start a transaction. Foreach operation who should be available for a transaction you should decorate the operation with a TransactionFlowAttribute.  

Adding this attribute should be done by hand. When you have decorated your interface correctly and followed the steps in the blogpost above, then your ready to go. But what happens when you have checked in your code and your colleague is working on the servicemodel and clicks on the generate button. You don’t get any errors, but you don’t see any transaction enlisted anymore in your Distributed Transaction Coordinator (DTC). One of the steps you need for a transactional service is removed from your code. The servicecontract is regenerated, this means that the old servicecontract with the TransactionFlowAttribute is replace with the new one generated by WSSF.

I could only think of one solution to avoid such an situation. The solution would be adding the TransactionFlowAttribute to the class (the service) who is also implemeting the interface. This isn’t a perfect situation, but it could avoid strange behavior in your transactional service.

Regards,

Dennis

Hi,

A year ago I wrote a post about WSSF and shared datacontracts. Well I am still using those lines of code to generate my own proxies for WCF services. A couple of months this was working very well on my new project. Somehow after an unknown change the generation of my datacontracts and proxy wasn’t working anymore. The datacontracts are still generated into a separated file but my proxy also contains my datacontracts which results in ambiguous compilation errors in my client application. After searching and troubleshooting for a couple of hours i found the solution. I made a simple change to my service contract in WSSF. I changed a response MessageContract from IsWrapped=false to IsWrapped=true. Well this is something i do very often so i couldn’t imagine this was the problem. I am used to change the IsWrapped property of my Request MessageContracts. You can set this property to true on the request without setting it to true on the response. This doesn’t have any consequences for the generation of your proxy. When you set the IsWrapped property of your response to true and on the request it’s still false, this will give you duplicate classes in your proxy.

Solution: “If you change the IsWrapped property of the response MessageContract make sure you do the same for the request MessageContract, otherwise you get duplicate classes into your proxy”

See the workitem on codeplex

Regards

The last few days i’ve been working on a WCF service which is using a few other services as sources. One of the source is the crmservice. Somehow when i was programming against the crmservice everything went smooth when i was testing it in the development server of Visual studio (Cassini). When i deployed the WCF service on a webserver in IIS the service was performing very poor. The CPU and the memory was rising sky high. It took me a while to figure it out, but a colleague of my pointed me to a very good post which was a start for solving my problem. I am not a CRM guru, so this post is maybe for some of you old news but you have to check this post of the CRM team. Down in the comments someone has a step by step description. You can find it here. Hopefuly you don’t have to spent to much time solving this issue.

Regards

In VSTS 2010 Microsoft has a pretty cool feature called “gated check-in”. This will prevent a check-in if it will break the build. Brian Harry mentioned this on his blog.

Regards

Relations in CRM 4.0

Hi all,

I am working on a project where i am implementing CRM 4.0. One of the demands of our customer is that they want to create relationships between Account entities and they want to store some additional information about this relationship. They want to add a startdate and an enddate attribute to the relationship entity. Well the relationship entity which is delivered out-of-the-box doesn’t give us any options the extend the entity with extra attributes. This means that we have to create our own relationship entity. Well in our situation we want to create N:N relation between the Account entities, which means we have to make the following relations:

Primary entity Relation Secondary entity
Account 1:N CustomRelation
Account 1:N CustomRelation

We have to add this type of relation twice otherwise we can’t make a N:N relation between Accounts. So far so good, what does this mean for our CRM interface. In the left menu you will see a link to Customrelationship Entity twice. This is something you don’t want.

CRM relation

The first link will show us the relationships where the selected Account is the primary entity in the relation and the second link will show us the relationships where the selected account is the secundary entity in the relation. So if we implement it in this way we don’t have an single view of all the relationships from one Account.

My Colleague Ronald Lemmen told me that this should be fixed with building a plugin. The plugin will be responsible for created a relationship the other way around. For example:

Organization A –> Organization B: this relationship is made in CRM.
Organization B –> Organization A: this relationship is made by the plugin.

This solution will result in 2 relationships between the same entities. CRM itself is using the same solution. See below. In the first screenshot we see that Avanade is the selected Account. Avanade is also Party1 in the relationship with Microsoft.

CRM relation

In the screenshot below we see the same relationship but the parties are reversed. Micorsoft is the selected account and Party1 in the relationship.

CRM relation

Now that we create a reversed relationship with our plugin we are able to remove one link in the menu (see first screenshot). This can be done in the screen where you add your relations between entities. I hope that this post will help other developers who are running into the same problem.

Kind Regards!

The last 2 days I have been testing a little piece of VSTS 2010. Something I liked is the way VSTS 2010 supports TDD. A lot of developers are familiar with TDD, some hate it and some love it. I don’t have a lot of experience with TDD, but I am very interested and tried this way of programming on my last project. Test-First development is something which makes you look different to your own code. I realized that I was focused even more on the signature of the method that I was writing. What are good input parameters and what are my return values.

When you start writing your first Unit test you will run into the annoying thing that every class you instantiate isn’t available yet. Well in VSTS 2010 the class is still not available, but there is a very simple way to make them available without losing the focus on your Unit test. See the screenshot below.

Generate class 

In this screenshot you see that the class which is giving an error because it doesn’t exist has a new option to create the class for me. You have 2 options:

  • Create the class directly in the project where the Unit test resides
  • Create the class in another project of your own choice

I think the second option is the best option, because you don’t want all your classes in the same project with all your test files. When you click on the section option (Generate other…) you will get the following panel.

Enter class information

As you can see in this panel you are able to select the following things:

  • Access modifier (Default, Public, Private, Internal)
  • Type (Class, Struct, Interface, Enum)
  • Project location (The project where you want the class to be created)
  • File name: (The name of the file)

Something what is missing is the opportunity to enter a namespace where the class should belong to. Default the class will belong to the same namespace where the unit test belongs to. Hopefully Microsoft will fix this before the release VSTS 2010. I changed the project location to another project because I don’t want my classes inside my test project. When you create the class in another project VSTS will automatically add a reference to the project where the class will be created.

Solution Explorer

Well the unit test isn’t finished yet. In my Unit test I want to test a method which multiplies the incoming parameter. So I need a method with the following signature:

  • Name: Multiply
  • Input parameter: int
  • Return parameter: int

I write this method down in my Unit test in a way it should be invoked if it exists.

New method

You can stub this method without leaving you Unit test. When VSTS creates a stub for me, it will implement the method with throwing a NotImplementedException. This is fine for me, because it doesn’t matter if the first run of my Unit test will fail. At the end the unit test will look like this.

Unit Test

The class which is generated for me will look like this.

Generated class

As you can see in the screenshot, the Multipy method is created with the right signature and it will throw an exception. The namespace isn’t correct like I already mentioned. The next thing to do is write functional code which will make the unit test pass. So test first development is something which is simple to do in VSTS 2010. When VSTS 2010 is released we are able to write our code in combination with unit tests in two ways:

  • Write our functional code first and generate a Unit test based on the class
  • Write a unit test and generate a class which supports those functionalities you are looking for

When this version of VSTS is released i am happy to do some TDD.

Microsoft is developing some pretty cool visualization features for branches. Sometimes it’s hard to explain to developers how you want to work with branches. You have a branch for the code base which is running right now on the production server. In case you get some bugs in production which should be fixed quickly, just switch to your production branch and fix the bug. Well when i got a bug in my production branch it’s also in my development branches. I should merge the bugs fix back to my developement branches. You can imaging that knowing which code runs where is pretty hard on a project with multiple branches.

There are whitepapers for branching strategies. When should i make a branch? when must I merge my development branch to the production branch. Which features are available in which branch. With the new visual tools coming in VSTS2010 this is very well organized. You have to check the following screencast on Channel9. Enjoy!

ADO.NET Dataservice

Hi,

With the release of Visual Studio 2008 SP1 and the .NET Framework 3.5 SP1, ADO.NET Dataservices is also released. With this technology you are able to expose multiple datasource as dataservices. ADO.NET Dataservice uses REST technolgy which means that every datasource is referenced by a URI. I think ADO.NET Dataservice is a technology which will be used very often in the future especially with the upcoming interrest for Silverlight. The project team already made some “How do I” videos available here! Enjoy

Regards

Hi all,

I have to recall my thoughts about the commnadline tool xsd.exe in the post: XML serialization. When an XSD element contains a minoccurs =”0″ and it’s not a string, there will be a property generated with the name. <element name>+Specified. This property is a boolean field which is used to determine if a field needs to be serialized to XML. The default value is false, so if you don’t set this field you won’t be able to see your data back in your XML.

Regards,

Dennis

HI,

Avanade (Gerben van Loon and David Slot) build a very nice extension for WSSF. This extension makes Entlib integration possible for your service layer without programming a single line of code. Very cool. Check it out on CodePlex.

Regards

Older Posts »