Tuesday, June 4, 2013

Register Client Id and Client Secret for Provider Hosted Sharepoint Apps


     Client Id and Client Secret is used to connect Window azure web sites / azure cloud services with Office 365 App (Provider Hosted Apps).
  1.      Generate Client Id and Client Secret from Sharepoint ( or Office 365) site
         Navigate to https://entc.sharepoint.com/_layouts/15/appregnew.aspx - this is office 365 site.     

         You need to generate AppId and App Secret and enter hosting domain and Redirect url.



          2.  Add Client Secret to App manifest (Sharepoint app --> AppManifest.xml , right click on it and select   "View Code")


           Put the Generated App ID in to Client ID Section


           3. Client Secret to Web.Config

         Then open the web config and put client secret and AppId to Web Config
     <appSettings>
       <add key="ClientId" value="ef07a76d-1df5-4831-8417-7f7a2778238a" />
       <add key="ClientSecret" value="U4urjkfT+jEhNAgIkCtM4Kl9uP6m9btx8oCvsb12KlA=" />
     </appSettings>

  4. Update ID and secret value in window azure Site

         We have to select the correct place to store these client Id and client Secret in window azure.
                
                a.       If the provider is Azure Web Site
                      Select the web site which we are going to host our site.Create new if you don’t have one


                    Then go to “CONFIGURE” à “App Settings”


b.       If the Provider is Azure Cloud Service
Then you need to remote login to the machine and put the web config manually.


Hosting Normal ASP.Net WebSite in Window Azure Web Site


  •      Create normal Asp.Net project and check all functionalities before hosting into Window azure Web Site
  •      Pubilsh it

  •     If you already have a profile , select that or else Import New Profile From window Azure.

  •      Click "Import"

  •      Click "Add Windows Azure Subscription"

  •       Click "Download Subscription file". If you have already connect with Window Azure Account , automattically download page will be opened and it will be started to download that file. If you haven't configure the connection you have to configure it first. once the download finish , browse that file, then click "Import".

  •      Then select the appropriate azure the Web Sites. If you don’t have any azure web site , go to manage portal and create new Azure Web Sites.  then get the latest subscription file and select the newly created site as Window Azure Web Site.

  •      Then select the appropriate azure the Web Sites. If you don’t have any azure web site , go to manage portal and create new Azure Web Sites.  

  •       Click "Next"

  •     Select the Correct Configuration and click Next,

  •      If You want , You can click “Start Preview” to check

  •     Everything Seems ok, so it is time to publish the site into Window Azure. Finally Click "Publish".

  • Once you get the success message you can go publish site link via browser. (The URL will be displayed in Output Window)

Call Rest Service from C#


There are lots of ways to call REST Services in your applcation, you can either use Javascript (JQuery Functions) or C# . here i am not going to compare anything. If you want to know how to call using JQuery go here. in this post we are going to look how to call REST Services using C#

Invoking Rest Services from C# Application

public class ServiceConnector
    {
        string EndPoint ;
        string Method ; 
        string ContentType ;
        EventLogger logger ;

        public ServiceConnector(string endpoint,string method, string contenttype,string logName)
        {
            this.EndPoint = endpoint;
            this.Method = method;
            this.ContentType = contenttype;
            logger = new EventLogger(logName);
        }
        public string MakeRestRequest(string parameters, string PostData)
        {
            var request = (HttpWebRequest)WebRequest.Create(EndPoint + parameters);
            logger.WriteToEventLog("Calling Services...");
            request.Method = Method;
            request.ContentLength = 0;
            request.ContentType = ContentType;

            if (!string.IsNullOrEmpty(PostData) && Method == "POST")
            {
                var encoding = new UTF8Encoding();
                var bytes = Encoding.GetEncoding("iso-8859-1").GetBytes(PostData);
                request.ContentLength = bytes.Length;

                using (var writeStream = request.GetRequestStream())
                {
                    writeStream.Write(bytes, 0, bytes.Length);
                }
            }
           
            using (var response = (HttpWebResponse)request.GetResponse())
            {
                var responseValue = string.Empty;

                if (response.StatusCode != HttpStatusCode.OK)
                {
                    var message = String.Format("Request failed. Received HTTP {0}", response.StatusCode);
                    logger.WriteToEventLog("Web Service Call Failed. More Details : " + message);
                    throw new ApplicationException(message);
                }

                // grab the response
                using (var responseStream = response.GetResponseStream())
                {  
                    if (responseStream != null)
                        using (var reader = new StreamReader(responseStream))
                        {
                            responseValue = reader.ReadToEnd();
                        }
                    logger.WriteToEventLog("Web Service Call succeed, response value is " + responseValue);
                }

                return responseValue;
            }
        }
    }

Check whether Service call work fines or not by creating console application.
use this code to call that function


ServiceConnector Service = new ServiceConnector("Enter your Service EndPoint here", "Enter Method", "Enter ContentType", "MyServiceLog");
String response = Service.MakeRestRequest("Pass your parameters", "Pass your PostData, keep it as empty if you do GET");



Wednesday, May 29, 2013

Create JSONP WCF Service




  • Open VS2012 , then Click New Project, Select  WCF Service library as  New Project  Template      (File --> New Project à WCF  --> WCF Service Library) and Change the Name and Solution name as “ClacLib” and “MyCalcultor”  



    
  •      Open IService1.cs file and delete everything and paste this
            using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.Text;

namespace ClacLib
{
    [ServiceContract]
    public interface IService1
    {
        [OperationContract]
        string GetData(int value);

    }
}


  • Add “System.ServiceModel.Web” as Reference to WCF Service Lib project.


  •  Open Service1.cs file and delete everything  and paste this

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.ServiceModel.Activation;
using System.ServiceModel.Web;
using System.Text;

namespace ClacLib
{

[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
   
    public class Service1 : IService1
    {

        [Description("Accepts LoginName and Get Employee By Login Name")]
        [WebGet(BodyStyle = WebMessageBodyStyle.Bare,
        RequestFormat = WebMessageFormat.Json,
        ResponseFormat = WebMessageFormat.Json,
     UriTemplate = " GetData?value={value}")]

        public string GetData(int value)
        {
            return string.Format("You entered: {0}", value);
        }
    }
}

Explanations:

WebGet – Get Method
Request Format and Response Format – accept and return data as JSON Objects
UriTemplate – PostFix of Service URL


  • Modify App.config file

You can delete this file , since we separate the service part from hosting part. But Keep   it As it is. We want only Web.Config file. 

  • Create new project under the same Solution and Select WCF Service Application as Project Template


  • Delete IService1.cs file and delete the cs file. We don’t want those two files since we have separated Service part from hosting part.




  •      Open Service1.svc file and delete ” CodeBehind="Service1.svc.cs"” part and Change the Service value

                                            Service Lib Project Name              Implemented Class Name


  • Add Service lib as Ref to Service Host project



Then click “OK”.

  • Modify the Web.config file

a.       Delete Service Model Section


b. Copy and paste below Section within that space as New Service Model

<system.serviceModel>

    <bindings>
      <webHttpBinding>
        <binding name="webHttpBindingWithJsonP" />
      </webHttpBinding>
    </bindings>

    <behaviors>

      <endpointBehaviors>
        <behavior name="webHttpBehavior">
          <webHttp helpEnabled="true" />
        </behavior>      
      </endpointBehaviors>

      <serviceBehaviors>
        <behavior>
          <serviceMetadata httpGetEnabled="true" />
          <serviceDebug includeExceptionDetailInFaults="true"/>
          <serviceThrottling maxConcurrentCalls="100" maxConcurrentSessions="1000" maxConcurrentInstances="1160"/>
          <dataContractSerializer maxItemsInObjectGraph="655360000"/>
        </behavior>
      </serviceBehaviors>

    </behaviors>

    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" />

    <services>
      <service name=" ClacLib.Service1">
        <endpoint address="Calc"
                  behaviorConfiguration="webHttpBehavior"
                  binding="webHttpBinding"
                  bindingConfiguration="webHttpBindingWithJsonP"
                  contract=" ClacLib.IService1"/>
      </service>
    </services>
  </system.serviceModel>

Explanations :

Services Tag –   Endpoint settings
Binding Tag -     Binding related Settings
Behaviors Tag - Behaviors related Settings


  •  Debug the application by press F5 or Click “Run”. It will host your service in localhost and open it in default browser. Give the correct URL and check whether it s working or not.

          Or else Use this URL
          http://localhost:8733/Service1.svc/Calc/GetData?value=4


  • Publish the Site and check again (How to Publish the Site ??? – Check here)

          I published the site in http://cd-ksurendran:8001
          Give some test values for {VALUE}

          Result of this URL look like this :



          If you don’t remember full URL  or want some help, Use this URL , it will display all  Operation Contract under specific Service Contract with some details

Result of this URL look like this :