SharePoint, Remote BLOB Storage (RBS), External BLOB Storage (EBS) and FILESTREAM

Finding #1: Remote Blob Storage RBS is recommended for SharePoint 2010 in conjunction with SQL Server 2008 R2. 

Finding #2: I don’t need FILESTREAM when I want use RBS. I can use FILESTREAM in conjunction with RBS though.

 

RBS

EBS

On Microsofts deprecation list

No

Yes

BLOB Store scope

Per Content DB

Entire farm

BLOB Storage Providers

More than one

Just one

Just for informational purposes, a high level architectural difference between RBS and EBS is that RBS is implemented by SQL Server 2008 R2 and EBS is implemented from a hotfix for MOSS 2007 in SP1 and is part of the SharePoint stack. EBS is still supported but is on the deprecation list.

For RBS, out-of-the-box you get a FILESTREAM provider from Microsoft which allows you to store blobs to disk drives (i.e. c:\myblobstore). It is important to note that SharePoint 2010 doesn’t know (and doesn’t care) that BLOBs are not in the database. That is the provider’s job. Third party vendors will surely release other providers, think storage in the cloud, NAS, other storage mechanisms. So if you need something more than the FILESTREAM provider from Microsoft, you are looking to the third party market.

What is Remote BLOB Storage?

A new feature in SQL Server 2008 R2 is Remote Blob Storage (RBS) which allows admins to setup SQL to save data that would normally go into a BLOB field to be stored outside the database using an RBS provider. This provider could store data on a cheaper disk solution (compared to the expensive disk solutions usually selected for SQL Server), to a SAN or maybe even into the cloud… it really doesn’t matter where. The point is that BLOBs can be kept out of a SQL Server DB.

For SharePoint this has big implications because as a document/attachment centric product, it stores a LOT of data in BLOBs generating large content databases. Before this feature became available in SQL 2008 R2 RBS was pretty much impossible. Some like External Blob Storage (EBS) was just not recommended. SharePoint 2010 when combined with SQL Server 2008 R2 allows admins to do RBS, keeping only metadata in de content DBs and keep the BLOBs out. This is a decisions not to be taken lightly.

First think about backup & restore policy. Additional backups are needed for the remotely stored BLOBs. Those who are looking to gain from RBS are large SharePoint implementations, high investment and usage. Third party vendors of backup software who support RBS therefor have an edge.

When to use Remote BLOB Storage

  • RBS is typically recommended in the case where the content databases are 4 gigabytes (4 GB) or larger.
  • When the number and the file size get bigger and bigger.
  • Intelligent backup and restore mechanisms are in place that support RBS.

When to use FILESTREAM

In SQL Server, BLOBs can be standard varbinary(max) data that stores the data in tables, or FILESTREAM varbinary(max) objects that store the data in the file system. The size and use of the data determines whether you should use database storage or file system storage. If the following conditions are true, you should consider using FILESTREAM:

  • Objects that are being stored are, on average, larger than 1 MB.
  • Fast read access is important.
  • You are developing applications that use a middle tier for application logic.

For smaller objects, storing varbinary(max) BLOBs in the database often provides better streaming performance.

Comparison point

Storage solution

File server / file system

SQL Server (using varbinary(max))

FILESTREAM

Maximum BLOB size

NTFS volume size

2 GB – 1 bytes

NTFS volume size

Streaming performance of large BLOBs

Excellent

Poor

Excellent

Security

Manual ACLs

Integrated

Integrated + automatic ACLs

Cost per GB

Low

High

Low

Manageability

Difficult

Integrated

Integrated

Integration with structured data

Difficult

Data-level consistency

Data-level consistency

Application development and deployment

More complex

More simple

More simple

Recovery from data fragmentation

Excellent

Poor

Excellent

Performance of frequent small updates

Excellent

Moderate

Poor

Table 1: Comparison of BLOB Storage Technologies Before SQL Server 2008


Figure #1: Read performance of various BLOB sizes

Find more info on FILESTREAM here and here.

Searching SharePoint from Windows7 Windows Explorer

In Windows7 you can create custom search connectors to OpenSearch search engines.

And YES… SharePoint 2007 en 2010 publish OpenSearch standard search engines.

It is really simple to create a connector to SharePoint.

  1. Open Notepad and copy in the XML below
  2. Replace the areas in red with your SharePoint Search Center information.  Be sure to only replace just the part of the URL that gets to your Search Center:  e.g.  http://sharepoint.company.com/SearchCenter  
  3. Change the scope if you want:  e.g.  &s=Intranet  or  &s=All%20Sites  or even  &s=People
  4. Save the file to your Desktop as:    SearchMySharePointSite.osdx
  5. Double click the file to install the Search Connector.  (it will install to your “Searches” directory  e.g.   c:\Users\<username>\Searches

And if you don´t have enough connectors… here is the rest of them

Amazon, DeviantArt, eBay, Flickr, Google Blogs, Google News, Live Search, MSN Search, Redmond Pie, Wikipedia, Yahoo and YouTube


————————————————————————————

<?xml version=”1.0″ encoding=”UTF-8″?>
<OpenSearchDescription xmlns=”http://a9.com/-/spec/opensearch/1.1/” xmlns:ms-ose=”http://schemas.microsoft.com/opensearchext/2009/”>
<ShortName>SharePoint Search</ShortName>
<Description>Search the SharePoint site.</Description>
<Url type=”application/rss+xml” template=”http://sharepoint.company.com/searchcenter/_layouts/srchrss.aspx?k={searchTerms}&amp;s=All%20Sites“/>
<Url type=”text/html” template=”http://sharepoint.company.com/searchcenter/Pages/Results.aspx?k={searchTerms}&amp;s=All%20Sites“/>
<ms-ose:ResultsProcessing format=”application/rss+xml”>
<ms-ose:LinkIsFilePath>-1</ms-ose:LinkIsFilePath>
</ms-ose:ResultsProcessing>
</OpenSearchDescription>

Information Worker VHD 2010

There’s a new Information worker are ready to be downloaded. You can find them here.

BUT…. can we I download them all the parts at once.

YEAH…. you can. Use the Akamai download manager.

The download is about 18 GB big.

This is the content :

Virtual machine “A” contains the following pre-configured software:

  1. Windows Server 2008 R2 Standard Evaluation Edition x64, running as an Active Directory Domain Controller for the “CONTOSO.COM” domain with DNS and WINS
  2. Microsoft SQL Server 2008 R2 Enterprise Edition with Analysis, Notification, and Reporting Services
  3. Microsoft Office Communication Server 2007 R2
  4. Microsoft Visual Studio 2010
  5. Microsoft SharePoint Server 2010 Enterprise Edition
  6. Microsoft Office Web Applications
  7. Microsoft FAST Search for SharePoint 2010
  8. Microsoft Project Server 2010
  9. Microsoft Office Professional Plus 2010
  10. Microsoft Visio 2010
  11. Microsoft Project 2010
  12. Microsoft Office Communicator 2007 R2

Virtual machine “B” contains the following pre-configured software:

  1. Windows Server 2008 R2 Standard Evaluation Edition x64, joined to the “CONTOSO.COM” domain
  2. Microsoft Exchange Server 2010

Active directory has been preconfigured over 200 “demo” users with metadata in an organizational structure. All of these user profiles have been imported and indexed for search within SharePoint Server 2010.
SharePoint Server 2010 has been configured in a “Complete” farm using the default SQL Server 2008 R2 instance. A default site has been created using the Team Site template at http://intranet.contoso.com/ and a FAST Search Center at http://intranet.contoso.com/search/.
As shipped virtual machine “A” requires image “B” for email. Running image “B” is optional.

The Big List of JavaScript, CSS, and HTML Development Tools, Libraries, Projects, and Books

Courtesy to Rey Bango

Debugging Tools That Make Life MUCH Easier:

Effectively debugging JavaScript applications is a royal pain in the derriere and to compile that, the available tools just don’t stand up to those used by managed code developers. Luckily, we do have a decent set of tools that lessens the pain substantially. Firebug is definitely a must have since it incorporates so much DOM & XHR introspection as well as the Web Developer Toolbar. Both are simply awesome. I also love Charles for HTTP sniffing and it’s saved my butt when Firebug couldn’t handle it.

IE8 Developer Tools – Microsoft’s browser debugger tools
Firebug – Mozilla’s browser debugger add-on
WebKit Web Inspector – Webkit’s browser debugger tools
Fiddler – HTTP Sniffer. Great for seeing Ajax requests.
Charles – HTTP Sniffer. Great for seeing Ajax requests. (my personal fav)
Service Capture – HTTP Sniffer. Great for seeing Ajax requests.
dynaTrace Ajax – HTTP performance analyzer
Web Developer’s Toolbar – All purpose Firefox toolbar to inspect everything on a page
YSlow – Analyzes page performance based on accepted industry best practices.
PageSpeed – Analyzes page performance based on accepted industry best practices.
DebugBar – An IE plugin that brings advanced debugging features to IE including JS, DOM & HTTP inspection

CSS Editors:

I prefer to write my CSS code by hand. Call me old-school but many swear by the following CSS editors. CSSEdit by MacRabbit (Mac only) is especially loved by many designers.

TopStyle
Rapid CSS
Xyle
Stylizer
CSSEdit

CSS Frameworks:

These frameworks have really taken off. Like their JavaScript brethren, they help to abstract much of the complexity of building consistent layouts in cross-browser fashion. They’re definitely something I need to look into more and from what I’ve read, 960 GS & Blueprint are the ones people are looking at.

960 Grid System
Blueprint CSS Framework
YAML
Yahoo YUI Grids CSS
Tripoli
Object-Oriented CSS

CSS Resets:

Want to minimize browser inconsistencies? Then use a CSS reset stylesheet to specify baseline CSS styles that make browser presentation defaults more consistent.

Meyer Reset by Eric Meyer
YUI2: Reset CSS
IECSS

JavaScript Libraries:

I definitely recommend everyone to learn JavaScript as you’ll need it to be a really effective client-side developer. With that said, a good JS library will go a long way to making your development faster and much more stable. These libraries are all very mature and dramatically help to abstract the complexities of cross-browser development. My personal favorite is jQuery, of which I’m a member of the project team.

jQuery
jQuery UI
Prototype
MooTools
Dojo
YUI
JavaScriptMVC
qooxdoo
Ext JS
Adobe Spry
Raphael.js – simplifies working with vector graphics on the web
LabJS Dynamic Script Loader – Allows execution and load management of JavaScript files
Lawnchair – A lightweight client-side JSON document store
Sessvars.js – Client-side session data management solution
Reactive Extensions For JS
PURE JS Templating Lib
Underscore.js – Utility lib for jQuery that provides a ton of extended functionality

and  http://dhtmlx.com/ for professional Ajax components for advanced web UI
JavaScript Minifiers

Every byte counts when you’re sending files via HTTP and best practices dictate that on a production, you need to optimize all of your files to minimize page load times. Compressing JavaScript code is one of the easiest ways to do that and these tools will help. On the jQuery project, we’ve started using Google’s Closure compiler because it’s generated the best compression. Try all of them out to see which suits you best.

YUI compressor
Closure compiler
JSMIN
Dean Edward’s Packer
Microsoft Ajax Minifer
Dojo Shrinksafe

JavaScript Shells

There are times when you just want to test a snippet of code without actually going through the trouble of creating a full page. That’s where JavaScript shells shine. JSFiddle and JSBin both rock because apart from supporting plain ole JS, they also allow you to include a host of libraries including jQuery, MooTools, & Dojo.

jsfiddle.net
JSBin
mootools.net/shell
(MooTools-specific)

Color Management:

As a programmer, I’m insanely color scheme challenged. I’m inclined to mix yellow with mauve causing a concerted moan to occur across the design community. Luckily, these tools help you choose web safe color schemes that are not only consistent but won’t burn the eyeballs off your site visitors.

Colourlovers
Kuler

Editors and IDEs:

I work at Microsoft so you would expect me to be a Visual Studio whiz. Not so. Only recently starting at MS, I’ve only dipped my toe in the VS waters. What I’ve seen though has impressed me but I still have a long way to go before I understand it. If you’re on a Mac, though, I do highly recommend both TextMate and Coda. Both are truly awesome. I’ve used Coda a little more because I liked the UI of it a little better than TextMate’s but TM’s bundle system and ecosystem is amazing. You can get code-complete for just about anything via bundles. For Windows, Notepad++ has been just awesome. I wish it had built-in FTP support like UltraEdit.

Visual Studio
Expression
TextMate
Coda
UltraEdit
Komodo IDE
Notepad++
Notepad2
BBEdit
Aptana
Espresso
Sublime Text
WebStorm
VIM
Eclipse
Netbeans

Wireframing:

I know some of you are cowboys (or cowgirls) and you just want to start hacking. Well, for the truly impatient, these tools at least let you wireframe your pages quickly and easily. I’ve used Balsamiq and FlairBuilder and both rock. It seems that FlairBuilder is really cranking it up with some nice features. Both are Adobe AIR apps which means they’re cross-platform.

Omnigraffle
Balsamiq
FlairBuilder
Visio
Axure

Browser Testing:

I’ve been fortunate to have multiple OS versions over the years. My wife would definitely prefer for me to have a couple of less PCs sitting around but it’s let me test out my web apps on a variety of platforms, browsers and OSes. Shoot, I even have a version of IE6! For those with less hardware, these services should definitely help. Note that services like BrowserCam & Gomez are subscription-based but worth the cash if you can afford it.

BrowserCam
Adobe BrowserLab
Microsoft Expression Web SuperPreview for IE
Gomez
TredoSoft MultipleIE
CrossBrowserTesting
Multi-Safari
Browserscope
Cuzillion
IETester

Testing (based on the list by John Resig):

This was a list I snagged from John Resig. Obviously, he’s done a boatload of testing so I know this list rocks. JSLint is the old mainstay created by Douglas Crockford but other have really become increasingly essential to good testing. jQuery developers should definitely be looking at QUnit & jQuery-Lint. The most complete tool is Selenium but it does have a bit of a learning curve. If you’re into determining JS performance, checkout SunSpider, Dromaeo, Google’s V8 Benchmark and JSLitmus. These measure the performance of the JS engine, not your apps.

JSLint
jQuery Lint
JSUnit
Selenium Core
JSSpec (MooTools)
UnitTestJS (Prototype)
QUnit (jQuery)
DOH Unit Testing (Dojo)
YUITest 2
YUITest 3
Mochitest
ScrewUnit
JsUnitTest
jsUnity
JsTestDriver
Crosscheck
Env.js
FireUnit
W3C Markup Validation Service
W3C CSS Validation Service
SunSpider
V8 Benchmark
Dromaeo
JSLitmus
HTML Validator Firefox Add-on

Documentation:

Yahoo UI Docs
APIs – Most comprehensive list of APIs on the web
jQuery Docs
jQuery UI Docs
MooTools Docs
Prototype Docs
Dojo Docs
JSON Reference
JSONP

Server-Side JavaScript

Rhino
Node.js
Narwhal.js
CommonJS Standards Project
Persevere
Comet

Books

The books below are really a great selection. I have many in my own library and every so often re-read them I’m currently reading High Performance JavaScript by Nicholas Zakas. Another great book is Stoyan Stefanov’s Object-Oriented JavaScript: Create scalable, reusable high-quality JavaScript applications and libraries. I also highly recommend Steve Souders performance book at the bottom of the list. They’re basically the definitive sources for optimizing your web apps.

JavaScript/DOM:

JavaScript Libraries:

HTML & CSS:

Performance:

Related posts:

  1. jQuery Still Amazes Me After 3 Years I have some downtime at the moment so I wanted…

How FIM2010 is not ADFSv2

AD FS provides Web SSO for on-premise and internet browser based applications. ADFSv1 is available in Windows Server 2008. ADFSv2 which is supposed to be much more powerful, will be released at the end of 2010Q2.

FIM2010 provides enterprise identity management in the form of provisioning, synchronization, and workflow. FIM2010 was released March 6th 2010.

Both are products of the Microsoft ForeFront Security Suite.

Not yet getting into anything heavily technical, let’s look at the immediate value both technologies bring to the table.

  1. Externalized authentication to a single service (brokered authentication)
  2. Automated data exchange (the process of managing the identity – provisioning/deprovisioning of accounts). This is can also encompass the process for authorization (AuthZ).

When talking Authentication (AuthN) and Authorization (AuthZ), these are different concepts but related. AuthN tells us who you are and AuthZ tells us what you are allowed to do. These topics can get pretty deep because there can be overlap between products in terms of the way authorization can be handled. For now, I’m just looking to explain how an operational process for managing the identities can be created using these two technologies.

There will be other posts talking about AuthZ in terms of RBAC via FIM 2010 and ABAC via claims in Windows Identity Foundation (WIF).

Considering both the entire lifecycle of the user and the end-to-end authentication and authorization process is key in delivering either an SSO or provisioning based solution.

 
 

ADFS 2.0 Authentication Break-down

A. Once a user logs into their corporate network, AD FS can securely process an authentication request to target applications (on-premise or cloud-based). No individual passwords are necessary and no additional logins are required. The technical break-down of the process is:

1. Client (requestor) initiates RST from IP-STS.

2. Secure Token Services (STS) aka Issuer authenticates the requestor and issues token with claims from various attribute stores. Claims provide authorization data for applications. The STS digitally signs the message for transport to be sure the token was issued by the issuer.

3. The token is returned to the client browser in which they will be redirected to the URI of the destination application.

4. RP-STS validates the authenticity of the token by the digital signature and then consumes the token and claims; therefore allowing the user into the application.

FIM 2010 Data Exchange (User Management) Break-down

B. It is very common for applications to require some kind of data exchange. This is especially typical for SaaS type applications. Here, FIM 2010 is extended to handle these data exchanges and to manage identities outside the firewall by automating the creation and management of identities into these target systems that reside in the cloud. Note: No passwords are synchronized across the internet.

5. FIM will automate the process of user creation, deletion, and modification processes through either a secured flat-file data exchange or through an XMA that interfaces public APIs provided by the SaaS vendor; therefore reducing administrative overhead and insuring consistency throughout all applications; locally or internet hosted.

With the ability to write custom workflows in FIM 2010, we can now develop better processes to determine whether users should even get an account provisioned in the cloud. And of course, the most important is to control the revocation of accounts in the cloud..

Keith Brown (PluralSight) has comprised a clear story about the why Identity Federation is the way of the future… rather than setting up ghost users in your corporate realm that look like users from your partners realm. Just one more thing about that. Allowing external users to your corporate network by setting up accounts for them has great disadvantages of course. It´s another set of credentials for the user to remembe, but most of all… revoking the account may never happing. Your partners, if ever, will tell you much later that this user accounts is revoked. You want to know immediatly. If your partner disables a user on his side, you want that user to be disabled on your side, obviously.

So why fedeating.

It ´s better for users

  • Less passwords to remember… not reduced to one identity… just less!
  • Better options for privacy/anonymity

Easier for application developers

  • Consistent way to get identity details
  • IdP does the heavy lifting

Can lead to better security

  • Incremental improvements to IdP benefit all apps

 

Conclusion

FIM2010 is not ADFS… since identity management and user provisioning is not federating identity stores.

Solve Sharepoint2010 Configuration Wizard in Step 5

After installing the prerequisites for Sharepoint2010 and running the Configuration Wizard an error occured in Step 5 registering the Sharepoint Server Search services.

Deleting the following two registry keys will enable the Configuration Wizard to finish.

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Shared Tools\Web Server Extensions\14.0\WSS\Services\Microsoft.Office.Server.Search.Administration.SearchWebServiceManagerService]

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Shared Tools\Web Server Extensions\14.0\WSS\ServiceProxies\Microsoft.Office.Server.Search.Administration.SearchWebServiceManagerServiceProxy]

Calling Postcode webservice from www.webservices.nl using from JavaScript

 

See here my implementation for calling both the national address and the international postcode webservice from www.webservices.nl.

 

    When multiple addresses need to be resolved, this is the dialog that should come up.

 

 

 

 

Webservice JavaScript

 

var CONTACT_ADDRESS_1 = 10;

var CONTACT_ADDRESS_2 = 11;

var CONTACT_ADDRESS_3 = 12;

var ACCOUNT_ADDRESS_1 = 20;

var ACCOUNT_ADDRESS_2 = 21;

var ACCOUNT_ADDRESS_3 = 22;

 

var ORGANISATION_NAME = “CRMORGANISATION”;

var SERVER_URL = “http://crm.dev.intra/&#8221;;

 

// —————————————–

// Validate Address with webservices.nl

// —————————————–

 

function AddressWebservice(i_Land, i_Postcode, i_Huisnummer, i_Toevoeging, i_Straat, i_Plaats, FORM_ADRES) {

/*

Examples for calling the webservice

https://ws1.webservices.nl/rpc/get-simplexml/UTF-8/addressReeksFullParameterSearch/WebService_User/****************/////93//2991/KK//

https://ws1.webservices.nl/rpc/get-simplexml/UTF-8/internationalAddressSearchV2/WebService_User/***********************///unter%20den%20eichen/1//wiesbaden///de//

*/

// Pre-checks

    this._debug = false;

    

    if (this._debug) {

        debugger;

    }

 

    // For dutch addrress postocde and huisnummer is required.

    // For international adresses al least 3 out of 4, when postcode is not filled

    if (i_Land == ‘NETHERLANDS’ || _IsNull(i_Land)) {

        if (_IsNull(i_Postcode) || _IsNull(i_Huisnummer)) { return true; }

    }

    else {

        if ((_IsNull(i_Postcode)) && (_IsNull(i_Straat))) {

            return true; }

        else {

            if ((_IsNull(i_Huisnummer)) && (_IsNull(i_Plaats))) {

                return true;

            }

        }

    }

    
 

// Set the credentials to successfully logon to the webservice

this._auth_username = ‘Webservice_User’;

this._auth_password = ‘*********************’;

    

/*

Interface for addressReeksFullParameterSearch method

*/

this._N6L_province = ”; // string

this._N6L_district = ”; // string

this._N6L_city = ”;                 //i_Plaats; // string

this._N6L_street = ”;                 //i_Straat; // string

this._N6L_houseNo = i_Huisnummer // int

this._N6L_houseNoAddition = i_Toevoeging; // string

this._N6L_nbcode = Left(i_Postcode.toUpperCase(),4); // string

this._N6L_lettercombination = Right(i_Postcode.toUpperCase(), 2); // string

this._N6L_addresstype = ”; // string

this._N6L_page = ”; // int

/*

Interface for the internationalAddressSearchV2 method

*/

this._I11L_organization = ”; // string

this._I11L_building = ”; // string

this._I11L_street = i_Straat; // string

this._I11L_housenr = i_Huisnummer + i_Toevoeging; // string

this._I11L_pobox = ”; // string

this._I11L_locality = i_Plaats; // string

this._I11L_postcode = i_Postcode.toUpperCase(); // string

this._I11L_province = ”; // string

this._I11L_country = i_Land // string

this._I11L_language = ‘NL’; // string

this._I11L_country_format = ‘iso_2’ // string

 

var _baseurl = ‘https://ws1.webservices.nl/rpc/get-simplexml/UTF-8&#8217;;

var _webmethod_international = ‘internationalAddressSearchV2’;

var _webmethod_national = ‘addressReeksFullParameterSearch’;

var _webservicecall = ”;

    this.items = new Array();

 

// Check address for the Netherlands

if (i_Land == ‘NETHERLANDS’ || _IsNull(i_Land)) {

        _webservicecall = _baseurl + ‘/’ + _webmethod_national + ‘/’ + this._auth_username + ‘/’ + this._auth_password + ‘/’ +

this._N6L_province + ‘/’ + this._N6L_district + ‘/’ + this._N6L_city + ‘/’ + this._N6L_street + ‘/’ + this._N6L_houseNo + ‘/’ +

this._N6L_houseNoAddition + ‘/’ + this._N6L_nbcode + ‘/’ + this._N6L_lettercombination + ‘/’ + this._N6L_addresstype + ‘/’ + this._N6L_page;

 

}

else {

_webservicecall = _baseurl + ‘/’ + _webmethod_international + ‘/’ + this._auth_username + ‘/’ + this._auth_password + ‘/’ +

this._I11L_organization + ‘/’ + this._I11L_building + ‘/’ + this._I11L_street + ‘/’ + this._I11L_housenr + ‘/’ +

this._I11L_pobox + ‘/’ + this._I11L_locality + ‘/’ + this._I11L_postcode + ‘/’ + this._I11L_province + ‘/’ +

this._I11L_country + ‘/’ + this._I11L_language + ‘/’ + this._I11L_country_format;

}

    

    var xmlhttp = GetXmlHttp();

if (xmlhttp) {

        xmlhttp.open(“POST”, _webservicecall, true);

        xmlhttp.setRequestHeader(“Content-Type”, “application/x-www-form-urlencoded”);

        

        try

        {

            xmlhttp.send(_webservicecall);

        }

        catch(ex)

        {

            alert(ex);

            //succesFullTransformation = false;

        }

        

        xmlhttp.onreadystatechange = function()

        {

            if(xmlhttp.readyState==4 && xmlhttp.responseXML)

            {

                var response = xmlhttp.responseXML;

            

                //var errorCode = response.documentElement.selectSingleNode(“ErrorCode”);

                //var errorMessage = response.documentElement.selectSingleNode(“ErrorMessage”);

                

                if (this._debug) {

                    debugger;

                }

                

                if (response == null || response.documentElement == null) {

                    var _msg = “Fout bij het ophalen van de postcde.\nControleer of de volgende combinatie een juist adres kan opleveren: \n”;

                    _msg += ((_IsNull(i_Land))?””:”Land: ” + i_Land + “,\n”);

                    _msg += ((_IsNull(i_Postcode))?””:”Postcode: ” + i_Postcode + “,\n”);

                    _msg += ((_IsNull(i_Huisnummer))?””:”Huisnummer: ” + i_Huisnummer + “,\n”);

                    _msg += ((_IsNull(i_Toevoeging))?””:”Toevoeging: ” + i_Toevoeging + “,\n”);

                    _msg += ((_IsNull(i_Straat))?””:”Straat: ” + i_Straat + “,\n”);

                    _msg += ((_IsNull(i_Plaats))?””:”Plaats: ” + i_Plaats);

                    alert(_msg);

                    return null;                     

                }

                else {

                    if (i_Land == ‘NETHERLANDS’ || _IsNull(i_Land)) {

                        this.items = NationalAddresObject(response); }

                    else {

                        this.items = InternationalAddresObject(response); }

                    }

                

                SetAddressFields(FORM_ADRES, this.items);

            }

        }

    }

}

 

function InternationalAddresObject(xmlResponse) {

    //alert(‘Under Construction’);

    

    var _resultcount = xmlResponse.documentElement.selectSingleNode(“/response/result”).childNodes.length;

    this.items = new Array();

    

    // adresregel 1, huisnummer, toevoeging, adresregel 2, adresregel 3, plaats, postcode, provincie, land

 

    switch(_resultcount)

    {

        case 0 :

            alert(‘Ongeldig huisnummer en postcode combinatie voor een buitenlands adres. Voer een geldig huisnummer en postcode combinatie in.’ );

            break;

        case 1 :

            this.items[0] = xmlResponse.documentElement.selectSingleNode(“/response/result/entry/address/street”).text;

            this.items[1] = xmlResponse.documentElement.selectSingleNode(“/response/result/entry/address/housenr”).text;

            this.items[2] = ”;

            this.items[3] = ”;

            this.items[4] = xmlResponse.documentElement.selectSingleNode(“/response/result/entry/address/province”).text;

            this.items[5] = xmlResponse.documentElement.selectSingleNode(“/response/result/entry/address/locality”).text;

            this.items[6] = xmlResponse.documentElement.selectSingleNode(“/response/result/entry/address/postcode”).text;

            this.items[7] = xmlResponse.documentElement.selectSingleNode(“/response/result/entry/address/province”).text;

            this.items[8] = xmlResponse.documentElement.selectSingleNode(“/response/result/entry/address/country”).text;

            break;

        default :

            //if (_resultcount == 20) {

                //alert(‘Er zijn 20 adressen of meer gevonden voor deze dit huisnummer en postcode combinatie.’);

                var arrAddresses = new Array();

                

                var _results = xmlResponse.selectNodes(‘/response/result/entry/address’);

                for (i=0; i<_resultcount; i++)

                {

                    arrAddresses[i] = _results[i].getElementsByTagName(‘street’)[0].text + ” ” +

                                     _results[i].getElementsByTagName(‘housenr’)[0].text + ” ” +

                                     _results[i].getElementsByTagName(‘countryspecific_locality’)[0].text + ” (” +

                                     _results[i].getElementsByTagName(‘province’)[0].text + “) ” +

                                     _results[i].getElementsByTagName(‘country’)[0].text

                }

 

                var props = ‘dialogHeight:400px;dialogWidth:730px;center:yes;resizable:no;status:no;scroll:no’;

                retval = null;

                retval = window.showModalDialog(‘/_static/_common/scripts/qnh/addresslist.html’, arrAddresses, props);

 

                if (this._debug) {

                    debugger;

                }    

                    

                if (retval != null) {

                

                    this.items[0] = xmlResponse.getElementsByTagName(‘result’)(0).getElementsByTagName(‘entry’)(retval).getElementsByTagName(‘address’)(0).getElementsByTagName(‘street’)(0).text

                    this.items[1] = xmlResponse.getElementsByTagName(‘result’)(0).getElementsByTagName(‘entry’)(retval).getElementsByTagName(‘address’)(0).getElementsByTagName(‘housenr’)(0).text

                    this.items[2] = ”;

                    this.items[3] = xmlResponse.getElementsByTagName(‘result’)(0).getElementsByTagName(‘entry’)(retval).getElementsByTagName(‘address’)(0).getElementsByTagName(‘province’)(0).text;

                    this.items[4] = ”;

                    this.items[5] = xmlResponse.getElementsByTagName(‘result’)(0).getElementsByTagName(‘entry’)(retval).getElementsByTagName(‘address’)(0).getElementsByTagName(‘locality’)(0).text

                    this.items[6] = xmlResponse.getElementsByTagName(‘result’)(0).getElementsByTagName(‘entry’)(retval).getElementsByTagName(‘address’)(0).getElementsByTagName(‘postcode’)(0).text

                    this.items[7] = xmlResponse.getElementsByTagName(‘result’)(0).getElementsByTagName(‘entry’)(retval).getElementsByTagName(‘address’)(0).getElementsByTagName(‘province’)(0).text

                    this.items[8] = xmlResponse.getElementsByTagName(‘result’)(0).getElementsByTagName(‘entry’)(retval).getElementsByTagName(‘address’)(0).getElementsByTagName(‘country’)(0).text

                    

                }

                break;

    }

    

    if (this._debug) {

        debugger;

    }

    

    return this.items;

}

 

function NationalAddresObject(xmlResponse) {

    //alert(xmlResponse.xml);

    var _resultcount = xmlResponse.documentElement.selectSingleNode(“/response/results”).childNodes.length;

    this.items = new Array();

    

    switch(_resultcount)

    {

        case 0 :

            alert(‘Ongeldig huisnummer en postcode combinatie voor een adres in Nederland. Voer een geldig huisnummer en postcode combinatie in.’ );

            break;

        case 1 :

            this.items[0] = xmlResponse.documentElement.selectSingleNode(“/response/results/entry/straatnaam”).text;

            this.items[1] = ”;

            this.items[2] = ”;

            this.items[3] = ”;

            this.items[4] = ”;

            this.items[5] = xmlResponse.documentElement.selectSingleNode(“/response/results/entry/plaatsnaam”).text;

            this.items[6] = xmlResponse.documentElement.selectSingleNode(“/response/results/entry/wijkcode”).text +

                            xmlResponse.documentElement.selectSingleNode(“/response/results/entry/lettercombinatie”).text;

            this.items[7] = xmlResponse.documentElement.selectSingleNode(“/response/results/entry/provincienaam”).text;

            this.items[8] = ”;

            break;

        default :

            alert(‘Er zijn meer adressen gevonden voor deze dit huisnummer en postcode combinatie’);

            break;

    }

    

    return this.items;

    

}

 

function SetAddressFields(i_Address, arrAddress) {

 

    // fill the form fields with

}

 

//——————–

// Common scripts

//——————–

function _IsNull( value ) {

return ( “undefined” == typeof( value ) || “unknown” == typeof( value ) || null == value || ”==value );

}

 

function xreplace(checkMe,toberep,repwith){

    var temp = checkMe;

    var i = temp.indexOf(toberep);

 

    while(i > -1)

    {

        temp = temp.replace(toberep, repwith);

        i = temp.indexOf(toberep, i + repwith.length + 1);

    }

    return temp;

}

 

function Left(str, n){

    if (n <= 0)

        return “”;

    else if (n > String(str).length)

        return str;

    else

        return String(str).substring(0,n);

}

 

function Right(str, n){

if (n <= 0)

return “”;

else if (n > String(str).length)

return str;

else {

var iLen = String(str).length;

return String(str).substring(iLen, iLen – n);

}

}

 

function GetXmlHttp() {

 

    var x = null;

    try

    {

        x = new ActiveXObject(“Msxml2.XMLHTTP”);

    }

    catch (e)

    {

        try

        {

            x = new ActiveXObject(“Microsoft.XMLHTTP”);

        }

        catch (e)

        {

            x = null;

        }

    }

 

    if (!x && typeof XMLHttpRequest != “undefined”)

    {

        x = new XMLHttpRequest();

    }

 

    return x;

}

2. AddressList.html

<!DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.0 Transitional//EN” “http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd”&gt;

<HTML>

    <HEAD>

        <title>Selecteer een adres</title>

        <meta content=”Microsoft Visual Studio 7.0″ name=”GENERATOR”>

        <meta content=”C#” name=”CODE_LANGUAGE”>

        <meta content=”JavaScript” name=”vs_defaultClientScript”>

        <meta content=”http://schemas.microsoft.com/intellisense/ie5&#8243; name=”vs_targetSchema”>

        <link href=”address.css” rel=”stylesheet” type=”text/css”>

    </HEAD>

    <body MS_POSITIONING=”GridLayout” onload=”init()”>

        <script language=”javascript”>

        function init()

        {

         //debugger;

         var arrList;

            var i;

            

            arrList = window.dialogArguments;

            

            var lb = document.getElementById(‘AddressSelector’);

            for (i=0;i<arrList.length;i++)

            {

                lb[lb.options.length] = new Option( arrList[i], 0);

            }

        }

        

        function closeme(val)

        {

            var SelText;

            var ret;

            var arrTokens;

            

            if (val == true)

            {

                var lb = document.getElementById(‘AddressSelector’);

                

                if(lb.selectedIndex >= 0)

                {                    

                    ret = lb.selectedIndex;

                }

                else

                {

                    ret = null;

                }

            }

            else

            {

                ret = null;

            }

            window.returnValue = ret;

            window.close();

        }

        </script>

        <form id=”crmForm” name=”crmForm” class=”crm” method=”post” runat=”server”>

            <table cellspacing=”0″ cellpadding=”0″ border=”0″ width=”100%” height=”100%”>

                <TBODY>

                    <tr height=”48″>

                        <td>

                            <table cellspacing=”0″ cellpadding=”0″ class=”mnubar” id=”mnuBar1″>

                                <tr>

                                    <td id=”tdTitle” class=”mnuTitle mnuRight” noWrap>Zoek een adres</td>

                                </tr>

                            </table>

                            <div style=”BORDER-TOP:#a8aeb5 1px solid; BORDER-BOTTOM:#ffffff 1px solid”></div>

                            <table cellspacing=”0″ cellpadding=”0″ class=”mnubar” id=”mnuBar2″>

                                <tr>

                                    <td id=”tdTitle” class=”mnuTitle mnuRight” noWrap></td>

                                </tr>

                            </table>

                            <div style=”BORDER-TOP:#a8aeb5 1px solid; BORDER-BOTTOM:#000000 1px solid”></div>

                        </td>

                    </tr>

                    <tr>

                        <td style=”PADDING-RIGHT:10px; PADDING-LEFT:10px; PADDING-BOTTOM:10px; PADDING-TOP:10px”>

                            <table width=”100%” height=”100%” cellspacing=”0″ cellpadding=”0″>

                                <tr>

                                    <td height=”15″></td>

                                </tr>

                                <tr>

                                    <td>

                                        <div class=”tab” style=”DISPLAY:inline”>

                                            <asp:Label id=”Label1″ style=”Z-INDEX: 101; LEFT: 10px; POSITION: absolute; TOP: 9px” runat=”server”>Selecteer een adres:</asp:Label>

                                            <SELECT id=”AddressSelector” style=”Z-INDEX: 104; LEFT: 11px; WIDTH: 688px; POSITION: absolute; TOP: 32px; HEIGHT: 168px”

                                                size=”10″ ondblclick=”closeme(true)” class=”INPUT”>

                                            </SELECT>

                                            <INPUT style=”Z-INDEX: 102; LEFT: 528px; WIDTH: 68px; POSITION: absolute; TOP: 208px; HEIGHT: 24px”

                                                type=”button” value=”OK” name=”btnOK” onclick=”closeme(true)”> <INPUT style=”Z-INDEX: 103; LEFT: 616px; WIDTH: 72px; POSITION: absolute; TOP: 208px; HEIGHT: 24px”

                                                type=”button” value=”Cancel” name=”btnCancel” onclick=”closeme(false)”>

                                        </div>

                                    </td>

                                </tr>

                            </table>

                        </td>

                    </tr>

                    <tr height=”23″>

                        <td class=”statusbar” colspan=”2″></td>

                    </tr>

                </TBODY>

            </table>

        </form>

    </body>

</HTML>

3.Address.css

formButton

{

background-color: #6699cc;

padding: 2px 4px 3px 4px;

color: #000000;

font-size: 8pt;

font-family: tahoma;

height: 17px;

filter: progid:DXImageTransform.Microsoft.Gradient(GradientType=0,

StartColorStr=#B4C5DF, EndColorStr=#91A9D0);

border-width: 0px;

}

 

TEXTAREA

{

font-size: 8pt;

font-family: tahoma;

width: 100%;

height: 100%;

border: 1px solid #7b9ebd;

 

}

 

.inputfields

{

font-size: 8pt;

font-family: tahoma;

width: 100%;

height: 19px;

border: 1px solid #7b9ebd;

}

 

INPUT.rad

{

width: 15px;

border: 0px;

cursor: hand;

}

 

DIV.tab

{

    overflow-y:            auto;

    padding: 10px;

}

 

TD.sec

{

    width:                100%;

    color:                #000000;

    font-weight:        bold;

    padding-left:        0px;

    padding-bottom:        2px;

    text-overflow:        ellipsis;

    overflow:            hidden;

}

 

TD

{

font-size: 11pt;

font-family: tahoma;

}

 

TD.bar

{

    border-bottom:        1px solid #000000;

}

 

 

TD.req

{

    font-weight:        bold;

    color:                #9F2409;    

    overflow:            hidden;

    text-overflow:        ellipsis;    

    padding-top:        5px;

}

 

TD.statusBar

{

    background-color:    #63769B;

    color:                #ffffff;

    padding-left:        5px;

    height:                24px;

    border-bottom:        1px solid #485673;

    font-weight:        bold;

}

 

 

LABEL

{

cursor: hand;

}

 

TD.radioLabel

{

padding-left: 2px;

padding-right: 10px;

}

 

TABLE.layout

{

table-layout: fixed;

width: 100%;

height: 100%;

}

 

div.tab

{

width: 100%;

height: 100%;

border: 1px solid #466094;

background-color: #EEF0F6;

display: none;

}

 

body

{

    font-size: 11px;

    margin:    0px;

    border: 0px;

    background-color: #acc0e9;

    cursor: default;

}

 

td

{

font-size: 11px;

}

 

table

{

cursor: default;

}

 

a

{

    color: #0000ff;

    font-weight: bold;

}

 

span.menu

{

height: 100%;

padding: 2px;

padding-left: 5px;

padding-right: 5px;

border: 1px solid #7288AC;

}

 

table.mnuBar

{

    color: #000000;

    height: 22px;

    width: 100%;

    filter:    progid:DXImageTransform.Microsoft.Gradient(GradientType=0, StartColorStr=#DCDFE5, EndColorStr=#BDC2CB);

}

 

td.mnuTitle

{

font-size: 11px;

font-weight: bold;

letter-spacing: 1px;

cursor: default;

color: #000000;

}

 

td.mnuRight

{

width: 100%;

text-align: right;

padding-right: 5px;

}

 

INPUT

{

font-size:        8pt;

width:            100%;

height:            19px;

border:            1px solid #7b9ebd;

}

MOSS2007: Error adding a New WebPart

What to do when this error occurs when you need to add a new webpart to your gallery of webparts.

The error:

File Not Found. at System.Signature._GetSignature(SignatureStruct& signature, Void* pCorSig, Int32 cCorSig, IntPtr fieldHandle, IntPtr methodHandle, IntPtr declaringTypeHandle)
at System.Signature.GetSignature(SignatureStruct& signature, Void* pCorSig, Int32 cCorSig, RuntimeFieldHandle fieldHandle, RuntimeMethodHandle methodHandle, RuntimeTypeHandle declaringTypeHandle)
at System.Signature..ctor(RuntimeMethodHandle methodHandle, RuntimeTypeHandle declaringTypeHandle)
at System.Reflection.RuntimeMethodInfo.get_Signature()
at System.Reflection.RuntimeMethodInfo.GetParameters()
at Microsoft.SharePoint.WebPartPages.SPWebPartSerializer.GetPersonalizableProperties()
at Microsoft.SharePoint.WebPartPages.SPWebPartManager.GetEffectiveWebPartType(Type webPartType, SerializationTarget serializationTarget, Boolean ignoreSupportsAttributeMarkup)
at Microsoft.SharePoint.WebPartPages.SPWebPartManager.GetEffectiveWebPartType(Type aspWebPartType, SerializationTarget serializationTarget)
at Microsoft.SharePoint.ApplicationPages.NewDwp.Page_PreRender(Object sender, EventArgs e)
at System.Web.Util.CalliHelper.EventArgFunctionCaller(IntPtr fp, Object o, Object t, EventArgs e)
at System.Web.Util.CalliEventHandlerDelegateProxy.Callback(Object sender, EventArgs e)
at System.Web.UI.Control.OnPreRender(EventArgs e)
at Microsoft.SharePoint.WebControls.UnsecuredLayoutsPageBase.OnPreRender(EventArgs e)
at System.Web.UI.Control.PreRenderRecursiveInternal()
at System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)

 

The cause of this error is caused probably for two reasons:

  1. You are using either the SmartPart webpart of Jan Tielens.
  2. Or ASP.NET Ajax is not installed on the SharePoint server.

All you need to do to correct this is download ASP.NET 2.0 AJAX Extensions 1.0, install it… and do a IISRESET.

 

Good luck.