Configuration Specific Web.Config in Visual Studio 2010

by Admin 30. July 2010 10:03

A cool feature of Visual Studio 2010 is the ability to have configuration files that are build configuration specific. Handling build configuration specific config files was always a challenge in the past where one had to store multiple config files for a dev environment versus a staging environment versus a production environment.

For example, a dev environment specific conf file would store the connection string to your dev database and the production envirnment web.config would store the connection string to your production database. Now when you moved your code between environments, you would have to make sure that the correct config file is copied over and that your production environment code is not accidentally pointing to your dev database.

This problem is solved by visual studio 2010 that allows cbuild configuration specific config files. In VS 2010, whenever you create a new web application project now, you'll see that your web.config in your solution explorer actually appears as an expandable node. When you expand it, you will see multiple configuration files for each of your build configurations, that can hold different values for each configuration.

Now when you build your application in a specific build configuration, the correct web.config settings get applied. Similarly when you publish, the correct web.config settings get published.

Tags: , , ,

ASP.Net | VseWss 3.0 v1.3

Multi-Tasking and Windows Mobile 7 - Myths & Reality

by Admin 15. March 2010 16:59

So there was a lot of chatter online on whether the windows mobile 7 platform, soon to be released will support multi-tasking. The answer is yes and no.

Multi-tasking is a feature by virtue of which multiple applications can run on the device simultaneously sharing the platform compueting and other resources. For example, a user may wish to load a webpage in the browser application, while they read their email in the mail application.

The answer to whether the OS supports multi-tasking, is yes - in that it does natively support running multiple applications simultaneously. This will be seen out of the box for applications that ship with the phones. For example you will be able to use your mail application while a webpage is loading in the browser or be able to listen to music or watch videos, while browsing the web.

However, Microsoft is being careful about how the multitasking features are exposed for third party applications that don't ship out of the box with the phone. This is necessary for a number of reasons. If a platform allows all 3rd party code to run in the background, the users may face degraded performance of the app in the foreground, depending on what resources are being hogged by the application that is running in the background. Also badly written applications can cause wasteful usage of the platform resources in the background thereby causing unpredictable battery life performance etc.

The platform does allow the running 3rd party applications a grace period after the user has switched away from the application, during which the application may save state, handle closing events and do some background operations before it is shut down. All written applications will be able to hook onto this event. The platform also allows push notifications to be sent for applications to their users. The users will see these notifications, even if they are not using the applications and can then go into the applications to do more.

Another feature that is exposed to 3rd party applications is that they recieve notifications of system events such as for example a call coming in while the application is being used. Because of this, the users can switch away from the application, take the phone call and then return to the application and continue using it in the state that they left it.

Tags: , , ,

.NET | iPhone | windows mobile 7

.LESS Dynamic CSS for .Net

by Admin 11. March 2010 18:13

If you haven't checked out the .LESS project already, check it out: http://www.dotlesscss.com/

.LESS is an open source implementation and port of Ruby's LESS Library, for .Net. It allows for the dynamic creation of cascading style sheets. Using less you can define dynamic style sheets that can have variables, operations, mixins and nested rules. It has great cachin features as well.

for a good article on improving CSS development using .LESS, check out the .LESS project website or this article by Scott Mitchell at http://www.4guysfromrolla.com/articles/030310-1.aspx

Tags: , , ,

.NET | ASP.Net

Periodically update webpage with server data - Simulate pushing data from server to client

by admin 2. February 2010 09:23

JavaScript has a function, setInterval(code, timeout) that can be used to periodically update a visitors web browser. Using this feature you could simulate pushing updates from the server side to the clients browser using AJAX.

The setInterval(<code>, <timeout>) function call takes 2 parameters. <code> which is the javascript call to run and <timeout> is the interval at which to periodically make that call. The call specified as the <code> parameter can be an AJAX call to fetch the data and update the browser part.

 function pageLoad(sender, args) { 
   setInterval('UpdatePage();', 2000);
}

For example, the above  javascript function can be set to run on page load, which in turn will call the UpdatePage() Javascript call every 20 seconds.

for a complete example, take a look at the 4 guys site @ http://aspnet.4guysfromrolla.com/articles/012109-1.aspx

Tags: , , ,

.NET | ASP.Net | JavaScript | Ajax

Call a webservice from TSQL (Stored Procedure) using MSXML

by admin 22. December 2009 15:13

I am working on a n integration project that required me to call a webservice through a stored procedure in the SQL database. After proving my concept using the CLR integration features in Sql Server, I learned that the production database was actually running on Sql Server 2000 compatibility level. There went my proof of concept.

So now I have to resort to doing web service calls the old way, making post requests using MSXML. This is what my stored procedure looks like.

CREATE proc [dbo].[spHTTPRequest]

      @URI varchar(2000) = '',     

      @methodName varchar(50) = '',

      @requestBody varchar(8000) = '',

      @SoapAction varchar(255),

      @UserName nvarchar(100), -- Domain\UserName or UserName

      @Password nvarchar(100),

      @responseText varchar(8000) output

as

SET NOCOUNT ON

IF    @methodName = ''

BEGIN

      select FailPoint = 'Method Name must be set'

      return

END

set   @responseText = 'FAILED'

DECLARE @objectID int

DECLARE @hResult int

DECLARE @source varchar(255), @desc varchar(255)

EXEC @hResult = sp_OACreate 'MSXML2.ServerXMLHTTP', @objectID OUT

IF @hResult <> 0

BEGIN

      EXEC sp_OAGetErrorInfo @objectID, @source OUT, @desc OUT

      SELECT      hResult = convert(varbinary(4), @hResult),

                  source = @source,

                  description = @desc,

                  FailPoint = 'Create failed',

                  MedthodName = @methodName

      goto destroy

      return

END

-- open the destination URI with Specified method

EXEC @hResult = sp_OAMethod @objectID, 'open', null, @methodName, @URI, 'false', @UserName, @Password

IF @hResult <> 0

BEGIN

      EXEC sp_OAGetErrorInfo @objectID, @source OUT, @desc OUT

      SELECT      hResult = convert(varbinary(4), @hResult),

            source = @source,

            description = @desc,

            FailPoint = 'Open failed',

            MedthodName = @methodName

      goto destroy

      return

END

-- set request headers

EXEC @hResult = sp_OAMethod @objectID, 'setRequestHeader', null, 'Content-Type', 'text/xml;charset=UTF-8'

IF @hResult <> 0

BEGIN

      EXEC sp_OAGetErrorInfo @objectID, @source OUT, @desc OUT

      SELECT      hResult = convert(varbinary(4), @hResult),

            source = @source,

            description = @desc,

            FailPoint = 'SetRequestHeader failed',

            MedthodName = @methodName

      goto destroy

      return

END

-- set soap action

EXEC @hResult = sp_OAMethod @objectID, 'setRequestHeader', null, 'SOAPAction', @SoapAction

IF @hResult <> 0

BEGIN

      EXEC sp_OAGetErrorInfo @objectID, @source OUT, @desc OUT

      SELECT      hResult = convert(varbinary(4), @hResult),

            source = @source,

            description = @desc,

            FailPoint = 'SetRequestHeader failed',

            MedthodName = @methodName

      goto destroy

      return

END

declare @len int

set @len = len(@requestBody)

EXEC @hResult = sp_OAMethod @objectID, 'setRequestHeader', null, 'Content-Length', @len

IF @hResult <> 0

BEGIN

      EXEC sp_OAGetErrorInfo @objectID, @source OUT, @desc OUT

      SELECT      hResult = convert(varbinary(4), @hResult),

            source = @source,

            description = @desc,

            FailPoint = 'SetRequestHeader failed',

            MedthodName = @methodName

      goto destroy

      return

END

/*

-- if you have headers in a table called RequestHeader you can go through them with this

DECLARE @HeaderKey varchar(500), @HeaderValue varchar(500)

DECLARE RequestHeader CURSOR

LOCAL FAST_FORWARD

FOR

      SELECT      HeaderKey, HeaderValue

      FROM RequestHeaders

      WHERE       Method = @methodName

OPEN RequestHeader

FETCH NEXT FROM RequestHeader

INTO @HeaderKey, @HeaderValue

WHILE @@FETCH_STATUS = 0

BEGIN

      --select @HeaderKey, @HeaderValue, @methodName

      EXEC @hResult = sp_OAMethod @objectID, 'setRequestHeader', null, @HeaderKey, @HeaderValue

      IF @hResult <> 0

      BEGIN

            EXEC sp_OAGetErrorInfo @objectID, @source OUT, @desc OUT

            SELECT      hResult = convert(varbinary(4), @hResult),

                  source = @source,

                  description = @desc,

                  FailPoint = 'SetRequestHeader failed',

                  MedthodName = @methodName

            goto destroy

            return

      END

      FETCH NEXT FROM RequestHeader

      INTO @HeaderKey, @HeaderValue

END

CLOSE RequestHeader

DEALLOCATE RequestHeader

*/

-- send the request

EXEC @hResult = sp_OAMethod @objectID, 'send', null, @requestBody

IF    @hResult <> 0

BEGIN

      EXEC sp_OAGetErrorInfo @objectID, @source OUT, @desc OUT

      SELECT      hResult = convert(varbinary(4), @hResult),

            source = @source,

            description = @desc,

            FailPoint = 'Send failed',

            MedthodName = @methodName

      goto destroy

      return

END

declare @statusText varchar(1000), @status varchar(1000)

-- Get status text

exec sp_OAGetProperty @objectID, 'StatusText', @statusText out

exec sp_OAGetProperty @objectID, 'Status', @status out

select @status, @statusText, @methodName

-- Get response text

exec sp_OAGetProperty @objectID, 'responseText', @responseText out

IF @hResult <> 0

BEGIN

      EXEC sp_OAGetErrorInfo @objectID, @source OUT, @desc OUT

      SELECT      hResult = convert(varbinary(4), @hResult),

            source = @source,

            description = @desc,

            FailPoint = 'ResponseText failed',

            MedthodName = @methodName

      goto destroy

      return

END

destroy:

      exec sp_OADestroy @objectID

SET NOCOUNT OFF

GO

The stored procedure takes the following parameters:

1.       @URI: the URI of the web service

2.       @MethodName: this would be ‘GET’ or ‘POST’

3.       @RequestBody: this is your SOAP xml that you want to send

4.       @SoapAction: this the operation that you want to call on your service

5.       @UserName: NT UserName if your web service requires authentication

6.       @Password: the password if using NT Authentication on the web service

7.       @ResponseText: this is an out parameter that contains the response from the web service

Here is a sample call to my service

declare @xmlOut varchar(8000)

Declare @RequestText as varchar(8000);

set @RequestText=

'<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:tem="http://tempuri.org/">

   <soapenv:Header/>

   <soapenv:Body>

      <tem:CreateOrder>

         <!--Optional:-->

         <tem:OrderRequest>

            <tem:OrderId>200</tem:OrderId>

            <!--Optional:-->

            <tem:OrderName>something</tem:OrderName>

         </tem:OrderRequest>

      </tem:CreateOrder>

   </soapenv:Body>

</soapenv:Envelope>'

exec spHTTPRequest

'http://localhost/testwebservices/helloworldservice.asmx',

'POST',

@RequestText,

'http://tempuri.org/CreateOrderForMe',

'', '', @xmlOut out

select @xmlOut

The stored procedure runs and selects the response from my service call which in my case is:

<?xml version="1.0" encoding="utf-8"?><soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"><soap:Body><CreateOrderForMeResponse xmlns="http://tempuri.org/"><CreateOrderForMeResult><Message>Order Created for me</Message></CreateOrderForMeResult></CreateOrderForMeResponse></soap:Body></soap:Envelope>

Note that the stored procedure automatically adds the appropriate http headers for Content-Type, SoapAction and Content-Length. If you need to pass additional http headers with your request, refer the section in the center of the stored procedure which is commented out. Basically you need a table in your database called RequestHeaders with 3 columns; HeaderKey, HeaderValue, Method. Populate this table with the keys and values for the additional headers. The Method column will contain GET or POST depending on what method you are using.

Another thing to note here is that I tried the above calls with MSXML2.XMLHTTP and Microsoft.XMLHTTP but did not succeed with either. I kept getting an error from msxml3.dll or msxml6.dll with message "The parameter is incorrect". I believe this to be a bug with msxml that requires the request body text to be in a specific format that is not available through a sql data type and hence cannot be used via TSQL. THese will hoever work fine when performing a simple http request (non- SOAP) or a SOAP request that does not need a request body. for performing SOAP requests from within TSQL the only component that worked for me was MSXML2.ServerXMLHTTP. There are some third-party components that I came across, some paid, but MSXML2.ServerXMLHTTP worked just fine for me.

The next step is to actually take the SOAP response that I recieved and extract the appropriate data from it - that will be another post.

Tags: , , ,

.NET | C# | SQL | SQL Server Management Studio

Passing JavaScript Objects to the CLR

by admin 16. December 2009 13:19

Passing JavaScript Objects to the CLR

Asp.Net 3.5 makes it easy to pass JavaScript Objects to the CLR for AJAX calls. Here it is...

For this example, I created an ASP.Net Web Service Application which gave me a simple web service to start off with called Service1.asmx. The sample service has a single sample web method called HelloWorld() which just returns the text “Hello World”. For this example, since we want to pass something to the service method, I modify the service method a little bit so it looks like below:

using System;

using System.Collections.Generic;

using System.Linq;

using System.Web;

using System.Web.Services;

namespace JSAjaxTest

{

    /// <summary>

    /// Summary description for Service1

    /// </summary>

    [WebService(Namespace = "http://tempuri.org/")]

    [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]

    [System.ComponentModel.ToolboxItem(false)]

    // To allow this Web Service to be called from script, using ASP.NET AJAX, uncomment the following line.

    [System.Web.Script.Services.ScriptService]

    public class Service1 : System.Web.Services.WebService

    {

        [WebMethod]

        public string HelloWorld(string text)

        {

            return text;

        }

    }

}

 Basically I just modified the method to accept a string and return that same string back.

Now add an application page to the project, default.aspx, which will contain the javascript that makes the AJAX call. The default.aspx page contains a script manager, a html button and a piece of javascript that gets called when the button is clicked to make the AJAX call. This is what the page looks like:

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="default.aspx.cs" Inherits="JSAjaxTest._default" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >

<head runat="server">

    <title></title>

    <script type="text/javascript">

        function CallService() {

            JSAjaxTest.Service1.HelloWorld("Hello World", function(response) { alert(response); });

        }

    </script>

</head>

<body>

    <form id="form1" runat="server">

    <div>

        &nbsp;<asp:ScriptManager ID="ScriptManager1" runat="server">

            <Services>

                <asp:ServiceReference Path="/Service1.asmx" />

            </Services>

        </asp:ScriptManager>

        <input type="submit" value="hitme" onclick="javascript:CallService();" /></div>

    </form>

</body>

</html>

Looking at the javascript on the page, the call is really made here:

JSAjaxTest.Service1.HelloWorld("Hello World", function(response) { alert(response); });

The call to the webservice through javascript uses the script manager to make the call, pass in the javascript argument and specifies the inline call back function which gets called when the AJAX call is complete. The inline function simply has an alert statement that displays the response.

When you run the project, clicking on the button will pass the text, “Hello World” to the “HelloWorld()” method of the web service via AJAX. There is no postback.

Tags: ,

.NET | C#

SharePoint: In a CAML query, filter by lookup item ID, not by its value

by admin 2. December 2009 12:55

Yes its possible!

Your filter for the CAML query probably looks like this currently:

<Query>
  <
Where>
    <
Eq>
      <
FieldRef Name ="Customer"/>
      <Value Type ="Text">
        Dunder Mifflin
      </Value>
    </
Eq>
  </
Where>
</Query>

But the "Customer" field is a lookup column to a different list of customers and on most view pages for customers, you probably need to fetch the related data using the Customer ID (the ID column for the customer list) and not the customer name.

Also, Sharepoint designer 2007 does not, using the UI, allow you to set a filter on a data form webpart and using a lookup column's ID field. You can only use the value of a lookup column in the filter.

Here's how I was able to do it after a bit of research...

<Query>
  <
Where>
    <
Eq>
      <
FieldRef Name ="Customer" LookupId="true" />
      <
Value Type ="Lookup">
       
15
     
</Value>
    </
Eq>
  </
Where>
</
Query>

Just add the LookupId = "true" attribute to the FieldRef tag and change the Value Type attribute to "Lookup". Your filter now looks up the value of the lookup column by using the ID of the item instead of the value.

Enjoy!

Tags: , , ,

CAML | MOSS | Sharepoint | XSLT

SharePoint sites keep asking for authentication and credentials don't work on your dev machine

by admin 24. November 2009 12:54

So I set up a development VM, nice and clean on a fresh install of Windows Server 2003. I used the VM for a number of months to do development without problems. Then one day, I start it up and suddenly I'm being prompted for credentials each time I try to access a SharePoint site. Whats worse is that the credentials don't work and I keep getting re-promted. Eventually I get an access denied page. Another symptom wass I was unable to reset the App Pools for the web application and kept recieving an Access Denied error. The wierd part was the web applications were experiencing these symptoms when trying to browse them locally, but from a remote computer, they were working just fine.

Nothing changed on my machine so the obvious reason must be a windows update. Searching online, I found the following link which fixed the problem right away.

http://support.microsoft.com/kb/896861

The issue occurs if you use loopback address mapping. Maybe you changed the hosts file on the local machine in order to set up a dummy domain for development. This used to work, but a recent windows update caused such a setu pto stop working and experience the above symptoms.

Tags: , ,

Sharepoint | Visual Studio | Windows Server 2003

Field type <blah> is not installed properly. Go to the list settings page to delete this field. - When trying to use custom field types developed using VseWss 3.0 v1.3

by admin 15. November 2009 04:17

When developing a custom field type using VseWSS 3.0 v1.3, I encountered a strange problem. The field type compiled successfully and deployed successfully as well, but whenever I tried to use the custom field type, I just got a generic error in SharePoint: “Field type <blah> is not installed properly. Go to the list settings page to delete this field.” Looking into the event log, the SharePoint logs and the vsewss log didn’t come up with anything useful either.

 

After searching a while online and coming up with a bunch of different solutions documented by other people, I found nothing worked. I went back to reading the VseWss 3.0 v1.3 release notes a couple of times over; especially the following couple of lines under the “Known Issues” section:

  • Custom Field Controls
    • During packaging additional XML configuration code will be added to the fldtypes_FieldControlName.xml file. To ensure the correct deployment of your field control you must add (if not already present) and Guid attribute to your SPField derived class. 

Example:[Guid("f5627588-e216-402e-844f-f85a0db34aa5")]
public class MyFC1Field : SPFieldText 

  • After packaging your project you must modify the fldtytypes_FieldControlName.xml file and synchronize the following element with your class's Guid:

<Field Name="FieldTypeClass">f5627588-e216-402e-844f-f85a0db34aa5</Field> 

·         Field control items are not able to be deployed due to a GUID being inserted instead of the type in the XML. This is a known issue , you can manually add the correct entry which will result in two entries in the fldTypes*.xml file 

I wasn’t entirely sure what this meant by when comparing the fldtypes_blah.xml that gets generated for the field type at C:\Program Files\Common Files\Microsoft Shared\web server extensions\12\TEMPLATE\XML and the fldtypes_blah.xml in my vsewss project, there was a difference.

The vsewss fldtypes_blah.xml contained:

<?xml version="1.0" encoding="utf-8"?>

<FieldTypes>
 <FieldType>
  <Field Name="TypeName">LogFieldFieldControlField</Field>    
  <Field Name="TypeDisplayName">LogFieldFieldControlField</Field>
 
<Field Name="TypeShortDescription">LogFieldFieldControlField</Field>   
  <Field Name="ParentType">Text</Field>
 
<Field Name="UserCreatable">TRUE</Field>
 
<Field Name="FieldTypeClass">b2931c02-1f9c-4eeb-8839-421be14a38d5</Field>
 
</FieldType>
</FieldTypes> 

The generated fldtypes_blah.xml that gets put in the 12 hive contained:

<?xml version="1.0" encoding="utf-8"?>
<FieldTypes>  
 <FieldType>    
 <Field Name="TypeName"BlahFieldControlField</Field>   
 <Field Name="TypeDisplayName">BlahFieldControlField</Field>   
 <Field Name="TypeShortDescription">BlahFieldControlField</Field>   
 <Field Name="ParentType">Text</Field>   
 <Field Name="UserCreatable">TRUE</Field>   
 <Field Name="FieldTypeClass">blah.blahcontrolfield</Field> 
 </FieldType>
</FieldTypes> 

Looks like the FieldTypeClass field node that contained the guid of the field type class gets replaced by the class name on deployment. But the class name is not fully qualified like most manual steps state that it should be.

I replaced it in the deployed fldtypes_blah.xml so that the xml node now looked like:

<Field Name="FieldTypeClass">Blah.BlahFieldControlField, blah, Version=1.0.0.0, Culture=neutral, PublicKeyToken=8adae1dce348f885</Field> 

i.e. the value is namespace.classname, assembly name, version, culture, publickeytoken  

Then restart IIS

that got my custom field type working. So what you need to do is deploy the solution using vsewss 3.0 v1.3, then go into C:\Program Files\Common Files\Microsoft Shared\web server extensions\12\TEMPLATE\XML, find your fldtypes_blah.xml and replace the FieldTypeClass node text which contains the class name to contain the fully qualified class name. Then restart IIS. So far this is what has worked for me, but if I come up with a better way, I’ll update this post.

Tags: , , ,

.NET | MOSS | Sharepoint | VseWss 3.0 v1.3

SharePoint versus file shares. When to use SharePoint and when to use a traditional file share?

by admin 19. September 2009 11:04

I get asked this question a lot. If an enterprise adopts SharePoint internally, does SharePoint replace file shares? 

My short answer is, no - SharePoint and file shares are not the same thing and they not meant to be thought about or used in the same way.  

Firstly SharePoint has limitations on the content that it is able to effectively store based on its type, its size, its numbers and its use. You can use a file share to store anything at all, provided there is available disk space. A fileshare has different limitations on how many documents it can effectively store and how it retrieves and searches them. 

Secondly, there is a reason why you are choosing to use SharePoint to store a particular document over a file share. It may be that

  • it is a file that needs to be made easily available (published) to multiple people within an organization,
  • or that it may actually needed to be worked on by different people,
  • or that different versions of it need to be maintained as it evolves,
  • or that there is a need to store additional business meta data around the document that cannot be stored in a traditional file system,
  • or it needs to be effectively and easily searched for by business users
  • or that it requires certain business processes to be built around it such as approvals or alerts. 

If you have none of the needs above, maybe you’re better off using a traditional file share.

For example, your IT department probably does not want to store the Windows 7 installer in a SharePoint document library. Your marketing department probably does not want to store its 700 mb video files that do not require versioning, collaboration, have any content to search within SharePoint. All that content can remain in a file share. 

SharePoint is a great place for storing files that are used for collaboration or publishing among team or across organization. It is even especially beneficial when you have given a good amount of thought to what files you are storing in document libraries and thought about the document metadata, its purpose and the business processes that the files are part of. This truly allows you to use the power of SharePoint to share, collaborate, search and publish documents and build business processes (workflows, events etc.) around these activities easily and quickly. This is the real reason why you want your files in SharePoint. 

On the other hand when you think of a file share, in the traditional sense, you are often talking about unclassified documents, with no business metadata, no versioning in the classic sense and you are talking about storing any type of file. The file could be a 10 GB video file, a PowerPoint presentation, a executable file or anything else. Little thought is given to what it is that you are actually storing, there is no related business metadata and usually difficult to build business processes around the contents. 

You do not want to replace your file share by dumping a huge number of unclassified files that were in a file share, into a share point document library. There is little benefit to doing this. There will be no business metadata that you will need to tie to unclassified content or build business process around. It would also be a pain point for users to effectively be able to use and search.

By doing your thinking ahead of time, you will quickly realize which of your unclassified documents that were in a file share need to be moved to SharePoint document libraries. You also realize that there will be different document library locations for different files. A document library would only hold carefully selected files having something in common and some business meta data in common, probably sharing a content type and business processes. 

Hopefully this will help you decide between when (and most importantly, how) to use SharePoint and when to use traditional file shares, for storing your files. A completely different conversation and should also be thought about, is the use of SharePoint versus document management systems like documentum or document locator. I never believe that there is a universal solution. A good solution depends on the problem it solves. There is always a very good reason to use SharePoint, file shares or a document management system depending on what business problem you are looking to solve. The only thing is, do your thinking & planning ahead of time – understand the problem or problems before deciding on the solution. 

Tags: ,

MOSS | Sharepoint