Friday, January 13

Could not find endpoint element with name... error when using a web part to connect to a WCf service

This is actually a more general WCf problem, but I decided to put it in the SharePoint section because it is more of a hidden problem in SarePoint development.

Typically, when you create a BizTalk WCF service and host it in IIS. Using it is as simple as consuming the service wsdl from your calling client via a service reference which will create entries in an app.config (or web.config) file corresponding to the needed / expected bindings, generating a proxy and using the service.

However, when you create a SharePoint web part for inclusion in a web page hosted in SharePoint server 2010 which in turn is used by to call the WCF service (in my case the WCf service was a BizTalk 2010 WCF service) you might get an error of the following type: Could not find endpoint element with name 'xxxx_xxx' and contract 'xxxx.xxxxx' in the ServiceModel client configuration section. This might be because no configuration file was found for your application, or because no endpoint element matching this name could be found in the client element

A long search on google actually returned a few potential )and sensible) solutions, none of which solved my problem.

  1. One solution is suggested here http://www.roelvanlisdonk.nl/?p=735 which suggests making sure the name in the contract attribute of the endpoint is the same as you’re Microsoft Visual Studio Service Reference name. Basically, when you add the service reference to the WCF service in Visual Studio, make sure the first part of the 'contract name' in your app.config endpoint element configuration matches the service reference name specified
  2. Another solution is suggested here http://www.vistax64.com/indigo/32159-location-name-config-file.html which suggests making sure that the fully qualified names are used in the app.config file for the contract attribute in the endpoint element. Meaning if the namespcae of your client applicaiton is smarties.mydev.callingclients, make sure the part of the endpoint element which spoecifies the contract is like: contract="smarties.mydev.callingclients.ServiceReference.Nameofcontractinservice"
  3. Another solution here http://social.msdn.microsoft.com/forums/en-US/biztalkgeneral/thread/071cb8bd-4891-4e42-8f63-f18f74f47f3f/ suggests ensuring that your app.config informaiton is correctly copied into your application.exe.config (or in my case application.dll.config) file (where application refers to the name of your client application). This will usually be located in the same locaiton to which your .exe or .dll file is built, and should be more or less identical to the app.config file
  4. The problem with my web part scenario was this: When you create a web part and add a service reference to it, it adds the configuraiton informaiton to the app.config file and (hopefully) the application.exe.config file. Unfortunately, when you ad the web part to a web page hosted in a SharePoint site, your client's app.config file is no longer used for the WCf call, as the hosting site's web.config file is the locaiton referenced for the configuration information. You need to copy your binding configuration information (<binding> element) and the endpoint confuguration information (<endpoint> element) into the relevant secitons of the <client> node within the System.Servicemodel section of the web.config file in the root location of the SharePoint site hosting the web page
After much thinking and brainstorming (since I am a BizTalk developer and not a SharePoint developer) and without much success searching on the Internet for my scenario, I solved the issue with the fourth step above

Monday, January 9

Object reference not set to an instance of an object error when consuming a web service exposed by the PeopleSoft Integration Broker

Object reference not set to an instance of an object error when consuming a web service exposed by the PeopleSoft Integration Broker

This error prevents adding the bindings from the web service to a Visual studio project even after using the svcutil tool to generate the wsdl and xsd files.

To fix this error, open the wsdl file in a text editor like notepad++

Open the wsdl types collection (<wsdl:types>)

Add a target namespace declaration to each imported schema in the colleciton:
e.g:
 <xsd:import schemaLocation="GetCompetenciesContainer.v1.xsd" namespace="http://www.mywsdlcompany.com/wcf/services/thiswsdlService/2010/01Container" />

becomes

<xsd:import schemaLocation="GetCompetenciesContainer.v1.xsd" namespace="http://www.mywsdlcompany.com/wcf/services/thiswsdlService/2010/01Container" targetNamespace="http://www.mywsdlcompany.com/wcf/services/thiswsdlService/2010/01Container"/>

Finally, add a target namespace declaration to the root schema node as well:

<xsd:schema elementFormDefault="qualified" xmlns:xsd="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.mywsdlcompany.com/wcf/services/thiswsdlService/2010/01Container">

Save the wsdl file and now use the Visual Studio tool with the wsdl and the downloaded xds files to generate the required bindings

BizTalk Development Errors: simple jargon-free problem and solution approach

------------------------------------------------------------------------------------

BizTalk Development Errors: simple jargon-free problem and solution approach

P: Visual Studio 2010 will not load BizTalk projects and BizTalk resources (like .btm BizTalk mapper files, .odx BizTalk orhcestration files etc)
S: You most likely installed Visual Studio after installing BizTalk. go to the 'Help --> About Microsoft Visual Studio' menu of Visual Studio and make sure that Microsoft BizTalk Server 2010 is in the list of installed products. If it is not, modify your BizTalk Server installation through the control panel (programs and features tab) and add the Developer Tools and SDK

P: When working with BizUnit or other xml-based tools, you get an error of the sort: the tag 'xxxx' does not exist in XML namespace 'clr-namespace:xxxx;assembly=xxxx'
S: First check the references in your project and make sure they are all fine. Secondly, make sure the reference to the namespace in xml is fully qualified (i.e. the full assembly name is used)

P: sqlservr.exe is using too much memory resources and affecting deployment of your biztalk applications due to out of memory errors

S: Fix SQL Server’s memory allocation. Go to SQL Server Management Studio, Right-Click on the Server, Properties à Memory. Set the maximum server memory (in MB) filed to a value your system can deal with, like 200MB for example

P: you get an ‘errors exist for one or more children’ error message when you’re trying to build a BizTalk orchestration project
S: this would usually be due to a problem in the scripts within an expression shape (the problematic one is usually identifiable by the red exclamation mark), or simply look through all your objects in the orchestration window to find any objects with the red exclamation mark. – This post http://stevestechnotes.blogspot.com/2010/07/biztalk-errors-exist-for-one-or-more.html also suggests some solutions

P: You get persistent ‘Schema referenced by Map "*****" has been deleted. The local, cached version of the BizTalk Server group configuration is out of date. You must refresh the BizTalk Server group configuration’ errors. Your list of BizTalk Applications isn’t showing in the Group. You try refreshing the BizTalk Group and it doesn’t solve the problem. You also try restarting host instance services and the [problem persists
S: See first part of the next solution below

P: When trying to use the baselangs.Any schema type for a map, you get 'Schema referenced by Map <mapname> has been deleted' error. Your BizTalk applications stop loading up in the Administration console.
S: If you’re only interested in getting your applications back in Administration console, open SQLserver, open the BizTalkMgmtDb, and open the dbo.bt_MapSepc table. Find the entry whose input (indoc_docspec_name) and output (outdoc_docspec_name)  schemas match your problem map and delete if from the table. This will remove the problematic map and allow the applications to load in BizTalk Administration Console.

However, if you’re hell bent on using your map and you wish to fix the problem, follow these steps. Delete your problematic application. Refresh the BizTalk Group. Add the Microsoft.XLANGS.BaseTypes dll to your BizTalk Group by adding it as an assembly to BizTalk Application 1. (Richt-click on BizTalk Application 1 à Add à BizTalk Assemblies à Browse to your BTS installation folder and pick the dll. Click on OK. Re-deploy your application
P: When trying to deploy you BizTalk solution, you get error: Parameter name: StrDBName:
S: The problem would usually have to do with the deployment properties in the btproj file (Properties -> Deployment -> Server) trying to deploy to a server to which you do not have access. It is probably set to another server other than your local sql server instance. Either change the server name to your local sql server instance, or if you are trying to deploy to a remote server, make sure the domain name is added to the server name (e.g. Sql server Devbbl02 on Domain btsdev.dev would be entered as Devbbl02.btsdev.dev)

P: when an xml message passes through a port, you get error: "An error occurred when parsing the incoming document: "Invalid Character in the given encoding"
S: The problem would usually have to do with improper or absent declaration in the xml file. BizTalk uses UTF-8 encoding by default in the disassemble and assemble stages of the receive and send pipelines. If as an example, a file in ANSI format containing foreign charcters (basically non-English characters - excuse my partialism) is passed through the receive port using the XMLReceive pipeline without the declaration (i.e. for the default U.S ANSI charset it would be "<?xml version="1.0" encoding="windows-1252"?> the pipeline simply would not be sure how to convert the byte representation of the foreign charcters (since different encodings use different byte representations for foreign characters). the pipeline would therefore not allow the xml file through and the error above would be thrown.

The easiest solution (which of course would almost never happen in the integration world) would be to have the declaration added to the xml file form source

Another solution is to use a custom pipeline component such as the one on this link. You would add it to the decode stage of the receive pipeline to let bizTalk know what encoding it will be dealing with. You then use that custom pipeline in the receive location

Finally, you could write a custom pipeline component to convert from ANSI to UTF-8 and use it in a similar way to the custom pipeline described above


P: after creating a Custom BizTalk Pipeline Component, the component does not show up in Visual Studio
S: To use a custom pipeline component in the Visual Studio design environment, you need three main steps. (a) write and build your component (b) GAC (Add the dll to the assembly) your pipeline component dll (c) add the component dll to the pipeline components directory in your BizTalk installation directory (typically c:\program files(or program files (x86) for 64-bit systems)\BizTalk Server 20_ _ (depending on your BTS version)\. After you have carried out all these steps right-click on the Visual Studio toolbox --> Choose Items --> BizTalk Pipeline Components.

If you do not see the components at this stage, close all open instances of Visual Studio, re-open Visual Studio, right-click on the Visual Stusio toolbox --> Choose Items --> BizTalk Pipeline Components. You should now see the component.


P: after creating a BizTalk Mapper Functoid, the functoid does not show up in Visual Studio
S: To use a custom mapper functoid in the Visual Studio design environment, you need three main steps. (a) write and build your functoid (b) GAC (Add the dll to the assembly) your functoid dll (c) add the functoid dll to the 'developer tools\mapper extensions\' directory in your BizTalk installation directory (typically c:\program files(or program files (x86) for 64-bit systems)\BizTalk Server 20_ _ (depending on your BTS version).

After you have carried out all these steps right-click on the Visual Studio toolbox --> Choose Items --> BizTalk Mapper Functoids. If you do not see the components at this stage, close all open instances of Visual Studio, re-open Visual Studio, right-click on the Visual Stusio toolbox --> Choose Items --> BizTalk Mapper Functoids. You should now see the functoid.

Wednesday, January 4

Creating an xml debugging file on the fly within development code

I sometimes use this technique for debugging during dev stages. Make sure you give the correct access to the folder in which you would like the xml file created

XmlTextWriter textWriter = new XmlTextWriter(@"C:\Testpipeline\myXmFile.xml", null);
                textWriter.WriteStartDocument();
                textWriter.WriteStartElement("Context");

                for (int i = 0; i < pInMsg.Context.CountProperties; i++)
                {
                    uvalue = pInMsg.Context.ReadAt(i, out sname, out snamespace).ToString();

                    //write all to new context except messagetype
                    if (sname != "MessageType")
                    {
                        outMsg.Context.Write(sname, snamespace, uvalue);

                        textWriter.WriteStartElement(sname, snamespace);
                        textWriter.WriteString(uvalue);
                        textWriter.WriteEndElement();

                    }
                    //promote all promoted
                    if (pInMsg.Context.IsPromoted(sname, snamespace))
                    {
                      
outMsg.Context.Promote(sname, snamespace, nvalue);                    }                   
                }


                textWriter.WriteEndElement();
                textWriter.WriteEndDocument();
                textWriter.Close();