Full Trust European Hosting

BLOG about Full Trust Hosting and Its Technology - Dedicated to European Windows Hosting Customer

Windows Server 2016 SSD Hosting - HostForLIFE.eu :: How To Securely Delete Files From Your Servers?

clock August 15, 2018 11:40 by author Peter

Do you know what happens when you delete a file in a GUI or run rm file.txt on the command line? If you said the file is deleted, you are only half right. In fact, the data stays just where it was before you “deleted” it. You can’t see it because the link the operating system used to identify the file and show it to you no longer exists. But the data is untouched until the operating system uses the space for a different file.

It’s easy to restore data that has not been securely deleted. That’s bad news if the hard drive the data is on is sold, leased to someone else, or thrown in the trash. There are business, security, and legal consequences if server data is not securely deleted.

The only way to securely delete data is to overwrite it. You could also destroy the drive, but businesses typically lease servers that they don’t have physical access to or they own. They need to be able to securely delete data remotely. A quick rm doesn’t cut it.

Before I outline the best way to securely delete a file or volume, a word of warning. If you do this, the data will be gone forever — that’s the point. Before running any of these commands, make sure you really mean it.

Securely Deleting A File

As I have already said, rm removes directory entries. It does not delete data. To securely delete the data, you must use a tool that both removes the link and overwrites the data.

One such tool is shred, which will repeatedly overwrite the file’s data with random bytes.

shred -u file.txt

Shred overwrites the file three times with random data, although you can specify how many times the data is overwritten with the -n option. If you don’t use the -u option, shred will overwrite the data but it won’t remove the file.

Securely Deleting A Drive

The shred utility can securely erase drives, but we’ll explore an alternative.

Before running these commands, check that you have correctly identified the drive you want to erase. The command will run on the boot and root drives without warning.

Linux represents drives as files. For example, the file /dev/sda1 represents the “first” drive on your server. The dev directory is not a normal directory, but a collection of special files representing devices connected to the server.

To see the drives connected to a server, run this command,

`fdisk -l`

Identify the drive that you intend to erase all data from and take note of the special filename. We’re going to use dd to overwrite the data on this drive with either random data or zeroes. The dd command “converts and copies a file”.

In this case, we’re going to take data from a special file and overwrite our target drive with it. Linux provides several special files that generate a stream of data, including /dev/zero and /dev/urandom, which contain lots of zeros and pseudorandom data respectively.

dd if=/dev/urandom > /dev/ss__ # replace __ with drive number

Here, we designate /dev/random as the input file and direct its data to overwrite the drive. This will destroy all data on the drive.

For added security, you can repeat the dd command several times or alternate between random data and zeros with:

dd if=/dev/zero of=/dev/sd__ # replace __ with drive number

On modern high-density drives, multiple passes are usually not necessary, but it doesn’t hurt.

Limitations

There are some limitations to this approach that you should be aware of. If the data is being backed up to a different drive, it may remain accessible. If the drive uses a modern journaling filesystem like ext4, some data may not be erased properly. SSD wear leveling can also interfere with secure deletion.

For sensitive data, it may be best to use an encrypted volume rather than relying on secure deletion. The data from an encrypted volume cannot be recovered without the key even if it has not been securely deleted.



European Visual Studio 2017 Hosting - HostForLIFE.eu :: Customize Visual Studio Code Shortcuts

clock August 10, 2018 11:13 by author Peter

A couple of months ago, I started using Visual Studio Code for my development activities. I found myself very uncomfortable with the keys and shortcuts. I have been using Visual Studio for more than 6 years now. So, I was very comfortable with the keys and shortcuts of that. The difference in shortcuts was creating a challenge for me. Should I remember a different set of shortcuts for VS Code? Should I start using some other editor?

Then, I started to customize the VS Code shortcuts. If you are also facing the same issues, then it's time you should consider customizing the Visual Studio Code shortcuts. It’s not worth spending energy on remembering a new set of shortcuts for a specific editor. Following are some tips,

  1. Open keyboard shortcuts in Visual Studio Code and update the shortcuts as per your need.
    Press ctrl+K, ctrl+s to open the keyboard shortcut window. This looks something like below.
  2. You can see the Edit button on the right side of the row (highlighted one). On click of the Edit button, it will ask you to change the combination you want to execute the command for.

    You can change the combination for your convenience.

  1. You can open keybindings.json file and update as per your need.
    To open the keybindings.json, you need to open the Keyboard shortcuts first by pressing ctrl+k, ctrl+s. You can click on the keybindings.json file.
  2. This will open the default keybindings. This is a JSON file which can be modified to get your desired shortcuts.
  1. You can have your custom JSON file with your shortcut commands.
    When you open default keybindings.json file in the right-hand side window, it opens a keybindings.json file where you can write your custom keys and commands.

Given are a couple of commands I have added in the keybindings.json file to work with the VS Code. Please let me know your feedbacks/ comments. Are there better ways I am not just aware of?



Node.js Hosting in Europe - HostForLIFE.eu :: Forgot Password Email Notification Using Node js

clock August 8, 2018 09:22 by author Peter

Before starting the code you need an account in send grid which will send the notification to your mail. Generally we use email notifications for forget passwords in your applications. You can follow the below steps to get the task done and if you have any queries please leave a comment below.

We require a few modules from npm to send the notification through the mail.

  • npm install formidable
  • npm install crypto
  • npm install async
  • npm install nodemailer

In my router.js file the following code will be present 
app.route('/forgotpasswordResponse') 
.post(userCtrl.forgotpasswordResponse); 


When I run my services and hit the above Url  from postman it will take you to the forgotpasswordResponse method. We are using post method in postman where we need to pass Email id as parameter

In forgotpasswordResponse my code is somthing like this,
exports.forgotpasswordResponse = function(req, res, next) { 

var input=req.body; 
//console.log(input); 
async.waterfall([ 
function(done) { 
    crypto.randomBytes(20, function(err, buf) { 
        var token = buf.toString('hex'); 
        done(err, token); 
    }); 
}, 
function(token, done) { 
    MongoClient.connect(url, function(err, db){  
        var dbo = db.db("Here is your DB Name"); 
        //console.log(req.body.Email); 
        var query = { Email : req.body.Email }; 
        dbo.collection('CLC_User').find(query).toArray(function(err,result){ 
            if(result.length == 0){ 
                req.flash('error', 'No account with that email address exists.'); 
            } 
            var myquery = { Email: result[0].Email }; 
            var newvalues = { $set: {resetPasswordToken: token, resetPasswordExpires: Date.now() + 3600000 }}; 
            dbo.collection("CLC_User").updateOne(myquery, newvalues, function(err, res) { 
                if (err) throw err; 
                console.log("1 document updated"); 
            }); 
             

           // console.log(result[0].Email); 
            done(err, token, result); 
        }); 
    }); 
}, 
function(token, result, done,Username,password) { 
    var emailVal = result[0].Email; 
    console.log(emailVal); 
    var Username=""; 
    var password=""; 
    MongoClient.connect(url, function(err, db){  
    var dbo = db.db("Here willbe your db name"); 
    dbo.collection('Accountsettings').find().toArray(function(err,result){ 
        if (err) throw err; 
        Username=result[0].UserName; 
        password=result[0].Password; 
       // console.log(Username); 
       // console.log(password); 
           // res.json({status : 'success', message : 'Records found', result : result}); 
     

    // console.log(Username); 
    var smtpTransport = nodemailer.createTransport({ 
        service: 'SendGrid', 
        auth: { 
          user: Username, 
          pass: password 
        } 
      }); 

    const mailOptions = { 
        to: emailVal, 
        from: '[email protected]', 
        subject: 'Node.js Password Reset', 
        text: 'You are receiving this because you (or someone else) have requested the reset of the password for your account.\n\n' + 
            'Please click on the following link, or paste this into your browser to complete the process:\n\n' + 
            'http://' + req.headers.host + '/reset/' + token + '\n\n' + 
            'If you did not request this, please ignore this email and your password will remain unchanged.\n' 
    }; 
    smtpTransport.sendMail(mailOptions, function(err) {                
        console.log("HI:"+emailVal); 
        res.json({status : 'success', message : 'An e-mail has been sent to ' + emailVal + ' with further instructions.'});             
        done(err, 'done'); 
    }); 
}) 
}); 

 
], function(err) { 
if (err) return next(err); 
 
}); 


In my case  I am using waterfall methologie for this method with will execute acyn in method, In the above code initially I am updating the collection with resetPasswordToken and resetPasswordExpires using email id and getting my send  grid credentials from db form  Accountsettings collections. If you can observe in mailOptions text "req.headers.host" will be the link which will get in you mail with token.

When you click on Url which you got in the email it will redirect you to another page to set the password.

Again we need to go to route.js and the code will be some thing like this. It will take to html page which we can reset the password,
app.route('/reset/:token') 
.get(Resetpassword.resetpasswordResponse);  

This time I am passing the token which I stored in db as "resetPasswordToken". Now it will take you to resetpasswordResponse method and the code is below,
exports.resetpasswordResponse = function(req, res) { 
console.log("welcome"); 
MongoClient.connect(url, function(err, db){ 
var dbo = db.db("Here is you db"); 
dbo.collection('CLC_User').findOne({resetPasswordToken: req.params.token, resetPasswordExpires: { $gt: Date.now() } }, function(err, user) { 
    if (!user) { 
        res.json({message: 'Password reset token is invalid or has expired.'}); 
    }else{ 
        console.log("coming"); 
        fs.readFile("api/Controllers/resetpassword.html", function (error, data) { 
            console.log("its working"); 
            if (error) { 
                console.log(error); 
                res.writeHead(404); 
                res.write('Contents you are looking are Not Found'); 
            } else { 
                //res.writeHead(200, { 'Content-Type': 'text/html' }); 
                res.write(data); 
            } 
            res.end(); 
        }); 
    } 
}); 
}); 


Your html code in resetpassword.html will be like this,
<!DOCTYPE html> 
<html> 
<head> 
<title>Reset Password</title> 
<script src="https://code.jquery.com/jquery-1.12.4.js"></script> 
<script src="https://code.jquery.com/ui/1.12.1/jquery-ui.js"></script> 
</head> 
<body> 
<h4 class="postdata" style="text-align:center;"></h4> 
<div class="main-agileits"> 
<h2 class="sub-head">Reset Password</h2> 
<div class="sub-main">     
    <form method="post"> 
        <span class="senddata"></span><br><br> 
             
        <input placeholder="Enter Password" name="password" class="password" type="password" required=""><br><br> 

        <input placeholder="Confirm Password" name="confirmpassword" class="confirmpassword" type="password" required=""><br><br> 
         
        <input type="submit" name ="submit" value="RESET PASSWORD"> 
         
    </form> 
</div> 
</div> 
</body> 
</html> 


<script type="text/javascript"> 

$( document ).ready(function() { 
$("input[name='submit']").on("click", function(){ 
$(".senddata").html(""); 
var url = window.location.href; 
var password = $('.password').val(); 
var confirmpassword = $('.confirmpassword').val(); 

if( password == confirmpassword){ 
    $.post(url,{Password : password},function(result,status){ 
    var msg = result.status; 
    var msgdata = result.message; 
    if(msg == "success"){ 
        $(".postdata").html(msgdata); 
        $(".main-agileits").css("display","none") 
    }else{ 
        return false; 
    } 
}); 
}else{ 
    $(".senddata").html("Passwords did not match"); 
}        
return false; 
}); 

}); 

</script>


the next step is send the Email notification after changing the password.The code is
app.route('/reset/:token') 
.post(setpassword.setpasswordResponsemail); 

exports.setpasswordResponsemail = function(req, res) { 
async.waterfall([ 
function(done) { 
    MongoClient.connect(url, function(err, db){ 
        var dbo = db.db("Your Db name goes here");  
        dbo.collection('CLC_User').findOne({resetPasswordToken: req.params.token, resetPasswordExpires: { $gt: Date.now() } }, function(err, user) { 
            if (!user) { 
                res.json({message: 'Password reset token is invalid or has expired.'}); 
            } 
            //console.log(user); 
            var myquery = { resetPasswordToken: req.params.token }; 
            var newvalues = { $set: {Password: req.body.Password,resetPasswordToken: undefined, resetPasswordExpires: undefined, modifiedDate : Date(Date.now()) }}; 
            dbo.collection("CLC_User").updateOne(myquery, newvalues, function(err, result) { 
                if (err) throw err; 
                //console.log("result ======" + result); 
                console.log("1 document updated"); 
            }); 
            done(err, user); 
        }); 
    }); 
}, 
function(user, done) { 
    MongoClient.connect(url, function(err, db){  
        var dbo = db.db("Your db name goes here"); 
        var Username=""; 
        var password=""; 
        dbo.collection('Accountsettings').find().toArray(function(err,result){ 
            if (err) throw err; 
            Username=result[0].UserName; 
            password=result[0].Password; 
        }) 
    }) 
    var smtpTransport = nodemailer.createTransport({ 
        service: 'SendGrid', 
        auth: { 
            user: Username, 
            pass: password 
        } 
    }); 
    var mailOptions = { 
        to: user.Email, 
        from: '[email protected]', 
        subject: 'Your password has been changed', 
        text: 'Hello,\n\n' + 
            'This is a confirmation that the password for your account ' + user.Email + ' has just been changed.\n' 
    }; 
    smtpTransport.sendMail(mailOptions, function(err) { 
        res.json({status : 'success', message : 'Success! Your password has been changed.'}); 
        done(err); 
    }); 

], function(err) { 
if (err) return err; 
}); 
}

Hope this code will help someone who really needs  it. Thank you.



European Visual Studio 2017 Hosting - HostForLIFE.eu :: How To Open Browser Or Run Program Directly From Visual Studio Code

clock August 3, 2018 09:39 by author Peter
Visual Studio Code is a Editor for running your code efficiently. It is now very popular editor for running your Source Code. Its features are very awesome and anyone can shift to Visual Studio Code. The best part is, it is free to use and free to download. The developers who are get bored from the OLD, Simple looking, Boring HTML code Editors can also shift to Visual Studio Code. It is Developed by Microsoft.Nowadays developers facing problems while running a simple HTML code directly from the Editor as Visual Studio Code does not have any in-built direct feature to run the code like other Editors or its own Visual Studio. But here is a solution to run the code directly from the Editor.

Start the Visual Studio Code Editor. On the left panel click on the Extensions Tab. Or Press (Ctrl + shift + X)


Then in the search bar search for "open in browser". You will get a list of plugins. For simplicity select first plugin and click install

After completion of the installation process it will ask for RELOAD.Just RELOAD the VSC(Visual Studio Code) Editor it will not cause any damage to your unsaved data.

After reloading just right click on your html file and select "Open in Other Browsers".

Select your required Browser and See your Output.

Another way to run is a Short cut key from your keyboard is (Alt+Shift+B).



Windows Server 2016 SSD Hosting - HostForLIFE.eu :: Streaming Logs Using Windows PowerShell

clock July 27, 2018 11:21 by author Peter

Log data helps technical personnel quickly drill down on application related issues including:

 

  • Pinpointing areas of poor performance
  • Assessing application health and troubleshooting
  • Diagnosing and identifying the root cause of application installation and run-time errors

There are a lot of tools available in the market which help you stream logs. But with most of them, I have personally experienced if they are easy to use they are paid and most of open source is too complex to configure. In this blog, I will explain how you can implement a simple log streaming tool using Powershell. This is more of a dev/debug helper tool, although if you invest time in the building then you can take it to a product level tool.
To start with,  below is a simple one-line Powershell which will read log file data in real time. The best part is it will WAIT for any more logs to be written on file and will stream it as soon as it completes on the file.

Get-Content "****LOG FILE PATH***" -WAIT

To take it to the next level let's manipulate the logs written before they are presented on screen. In the below code sample if you provide a log with the message containing "*" then the script will change all "*" to "@" before presenting.

Sample log message: INFO InfoLog - ***************CONFIG READ***************
$file = "*******LOG FILE PATH********"  
Get - Content $file - Wait | ForEach - Object - Begin {  
    $counter = 1  
    $lines = @(Get - Content $file).Count  
} - Process {  
    if ($counter++ - gt $lines) {  
        Write - host $_.ToString().Replace("*", "@")  
    }  
}  


Let's take it a bit further. Suppose we need to present Error type messages to be highlighted with RED. And the rest of the message must be in GREEN.
Sample log message: INFO InfoLog - ***************CONFIG READ****************
Sample log message: ERROR ErrorLog - ************CONFIG READ****************

$file = "*******LOG FILE PATH********"  
Get - Content $file - Wait | ForEach - Object - Begin {  
    $counter = 1  
    $lines = @(Get - Content $file).Count  
} - Process {  
    if ($counter++ - gt $lines) {  
        if ($_.ToString().Contains("ERROR")) {  
            Write - host $_.ToString() - foregroundcolor "red"  
        } else {  
            Write - host $_.ToString() - foregroundcolor "green"  
        }  
    }  
}  


There are endless possibilities and use cases which can be implemented, the sky is the limit.



Windows Server 2016 SSD Hosting - - HostForLIFE.eu :: Dedicated Servers As The Secured Solutions

clock July 25, 2018 11:05 by author Peter

When it comes to the option of dedicated servers, you may find it costly in comparison to other web hosting options. But ultimately, the choice is worth making because plenty of commercial benefits are integrated into this web hosting plan. Let’s see how it is a better option than others web hosting plans.

Better uptime
In dedicated hosting arrangements, the service provider reserves the SLA,  including the solution of hardware failure. The service provider maintains a support team for 24x7. With expert skill sets and ITIL complaint methods you can be sure about a high uptime.

Cost efficiency
This is a cost efficient option. According to the plan, a dedicated hosting service provider is responsible for upgradates and maintenance of hardware for maintaining connectivity, and for offering a friendly physical environment. Under this plan, you as a user have no obligation to pay for the total server room or for employing a service administrator. Under this plan you have to pay for the services you will be using.

Reliable bandwidth
Under this web hosting plan you will get to enjoy higher internet speed. There is no chance to lose the speed as there is no risk of sharing the connection. This will help in faster communication, upload management, and uninterrupted business presence.

Complete control on applications
If you select dedicated web hosting, you will enjoy a complete monopoly of decisions about using site management tools and allied other applications to boost your hosting environment. However, about the tools, you need to get prior approval from your hosting service provider that they will be able to give you backend support to maintain them.

Better security arrangement
Dedicated hosting service offers uninterrupted access to physical server. The security arrangement includes supervision cameras, Biometric Access Control System, round-the-clock patrolling, etc. for improved security. Advanced service providers often provide additional supports like DDos guard, web application firewall, VAPT, and security event management.

These reasons can clearly  justify why Dedicated Server is a better option. It is clearly understood that although expensive, this category of web hosting service offers excellent ROI (Return over investment).



European Visual Studio 2017 Hosting - HostForLIFE.eu :: Working With Progress Bar Control In Visual Studio 2017

clock July 18, 2018 11:12 by author Peter

In this article, I will explain how to use Progress Bar control in Windows.Forms applications. Progress Bar control is an important control; many applications need to include progress bar control in them. Designing a Progress Bar in Windows.Forms application is simple and it can be used in the application. Follow the steps given below to create a Progress Bar.

Step 1
Open Visual Studio 2017--->NewProject--->Windows.Forms application and name it Progress Bar.

 

Step 2
From the toolbox, drag and drop the button control into the form and right click on the button. Select property. Here, you can change the text, font, and the name of the button. In my Project, I changed the text of the button to "Load Progress Bar".

Step 3
Now, drag and drop the Progress Bar from the Toolbox to Windows.Forms in Visual Studio. Right-click on the progress bar and select property. Here also, you can change the text, font, and name of the Progress Bar. Progress bar is a control that applications use to indicate the progress of a lengthy operation, such as calculating the result, downloading a large file from the web etc. Progress Bar control is used whenever an operation takes more than a short period of time. The maximum and minimum properties define the range of values to represent the progress of a task.

Step 4
Now, drag and drop the timer control from the toolbox to the Windows.Forms in Visual Studio. The detailed function of Timer control is already explained in my previous article.

Step 5
Now, it's time to code. Follow the code given below in the screenshot for the Button-Click event.

Step 6
Now, follow the code given below in the screenshot for the timer click event. A progress bar control is used to display the progress of some activity. I have added a timer control to the form and on the timer tick event handler, I increment the value of the progress bar.

Output
Compile and run the project. The final output of the project obtained is as given below in the screenshot. As the "Load Progress bar" button is pressed, the progress bar starts to display the progress.

Summary
Hope you all understand the working of a progress bar. In case of any problem or error, please feel free to comment down below. In my next article, I will explain how to install NuGet Packages and work with Circular progress bar control in Windows.Forms application.

 



European Entity Framework Hosting - HostForLIFE.eu :: Transactions In Entity Framework

clock July 11, 2018 11:11 by author Peter

In this blog, we will be talking about how transactions take place in Entity Framework. DbContext.Database.BeginTransaction() method creates a new transaction for the underlying database and allows us to commit or roll back changes made to the database using multiple SaveChanges method calls.

The following example demonstrates creating a new transaction object using BeginTransaction(), which is, then, used with multiple SaveChanges() calls.

using(var context = new SchoolContext()) { 
using(DbContextTransaction transaction = context.Database.BeginTransaction()) { 
    try { 
        var standard = context.Standards.Add(new Standard() { 
            StandardName = "1st Grade" 
        }); 
        context.Students.Add(new Student() { 
            FirstName = "Rama2", 
                StandardId = standard.StandardId 
        }); 
        context.SaveChanges(); 
        context.Courses.Add(new Course() { 
            CourseName = "Computer Science" 
        }); 
        context.SaveChanges(); 
        transaction.Commit(); //save the changes 
    } catch (Exception ex) { 
        transaction.Rollback(); //rollback the changes on exception 
        Console.WriteLine("Error occurred."); 
    } 

In the above example, we created new entities - Standard, Student, and Course and saved these to the database by calling two SaveChanges(), which execute INSERT commands within one transaction.

If an exception occurs, then the whole changes made to the database will be rolled back.

I hope it's helpful.



Node.js Hosting in Europe - HostForLIFE.eu :: Node.js NPM Proxy Configurations

clock March 2, 2017 08:17 by author Peter

It is often required to work with Node.JS and NPM package installer behind the proxy. When trying to install npm packages behind the proxy, you may come across the error, given below.

To resolve exceptions, shown above, http_proxy and https_proxy configurations needs to be done for NPM. The step by step guidance is given below to perform the configuration on Windows machine-Go to C:\User\{User} directory.

  • if .npmrc file exists then open it in notpad editor else create .npmrcfile.
  • Add the lines, given below to the file for your valid AD domain user. proxy=http://domain\\username:[email protected]:port
  • Add the lines, given below for Non AD user proxy=http://username:[email protected]:port
  • Save .npmrc file
  • Try to use npm install now. It should work without any error.

The sample contents of .npmrc file are shown below.



European WCF Hosting - HostForLIFE.eu :: Message Exchange Patterns In WCF

clock February 23, 2017 08:24 by author Peter

A message exchange pattern means how the client and WCF service exchange the message (data) internally. There are a total three types of patterns,

  • Request – Reply
  • One Way
  • Duplex

We will learn each of them in detail below.

Request – Reply
In request reply pattern client sends the request to WCF service and waits for the response from the WCF service. Until they get a reply no other process runs. After getting a response from the WCF service they will continue its work. If WCF service has a method with void return type then the client will wait for the reply.

So in this pattern if any error occurs then it will directly display on the client side. Default pattern for any methods is request – reply. You can declare any method to request a reply by assigning ‘IsOneWay=false’ as show below.
    [ServiceContract] 
            public interface IMessageExchPatterns 
            { 
                [OperationContract] 
                string GetDataRequestReply (string name); 
    }

OR
    [ServiceContract] 
            public interface IMessageExchPatterns 
            { 
                [OperationContract(IsOneWay=false)] 
                string GetDataRequestReply (string name); 
    } 

As shown in the above example you can declare request reply pattern in two ways.

One Way
In One way pattern client sends the data or request to WCF service but it doesn't wait for any reply from the service and also service doesn't send any reply to them, so here the client will not show any thing on service then will only send the message to service. It doesn't check if that message reaches the service or not. You can set this pattern by IsOneway=true.

Example
    [ServiceContract] 
            public interface IMessageExchPatterns 
            { 
                [OperationContract(IsOneWay=true)] 
                void GetDataOneWay (string name) 
    } 

Duplex
In Duplex pattern you have to predict that there are  two clients (client-1, Client-2); client-1 makes request to service and then service will sent request to client-2 and then service gets response from client-2 and give this replay to client-1.

Here this pattern is to use the callback method for the internal (client to client ) communication. So here we have to define the callback interface as show below,
    [ServiceContract(CallbackContract=typeof(IMessageExchPatternsCallback))] 
            public interface IMessageExchPatterns 
            { 
                [OperationContract(IsOneWay = false)] 
                string GetDataRequestReply(string name); 
     
                [OperationContract(IsOneWay=true)] 
                void GetDataOneWay(string name); 
     
            [OperationContract] 
                void GetDataDuplex(string name); 
            } 
     
            public interface IMessageExchPatternsCallback 
            { 
                [OperationContract] 
                void SendData(string name); 
    } 

As shown in above example we specify the,
    [ServiceContract(CallbackContract=typeof(IMessageExchPatternsCallback))] 
Here we specify the call back contract for the interface. This callback interface (IMessageExchPatternsCallback) is implementing on client side.
    [ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Reentrant)] 
    public class MessageExchPatterns : IMessageExchPatterns 
    { 
             
            public string GetDataRequestReply(string name) 
            { 
                return "You have enter : " + name; 
            } 
     
            public void GetDataOneWay(string name) 
            { 
                Console.Write("You have enter : " + name); 
            } 
     
            public void GetDataDuplex(string name) 
            { 
                OperationContext.Current.GetCallbackChannel<IMessageExchPatternsCallback>().SendData("Hi, " + name); 
            } 
    } 


Now host this service on console application
ServiceHost host = new ServiceHost(typeof(MessageExchPatterns.MessageExchPatterns)); 
host.Open(); 
Console.Write("Service started..."); 
Console.Read(); 


Now create client application with Window form application as below.

Write code as shown below,
[CallbackBehavior(UseSynchronizationContext = false)] 
public partial class Form1 : Form,ServiceReference1.IMessageExchPatternsCallback 
    { 
        public Form1() 
        { 
            InitializeComponent(); 
        } 
 
        InstanceContext instanceContext; 
        private void button1_Click(object sender, EventArgs e) 
        { 
            
            ServiceReference1.MessageExchPatternsClient clnt = new ServiceReference1.MessageExchPatternsClient(instanceContext); 
            label1.Text = clnt.GetDataRequestReply(textBox1.Text); 
        } 
 
        void ServiceReference1.IMessageExchPatternsCallback.SendData(string name) 
        { 
            Label3.Text = name; 
        } 
 
        private void button2_Click(object sender, EventArgs e) 
        { 
             
MessageExchPatternsClient clnt = new MessageExchPatternsClient(instanceContext); 
            clnt.GetDataOneWay(textBox2.Text); 
        } 
 
        private void button3_Click(object sender, EventArgs e) 
        { 
ServiceReference1.MessageExchPatternsClient clnt = new ServiceReference1.MessageExchPatternsClient(instanceContext); 
            clnt.GetDataDuplex(textBox3.Text); 
        } 
 
        private void Form1_Load(object sender, EventArgs e) 
        { 
            instanceContext  = new InstanceContext(this); 
        } 
    } 


Now run the WCF service host. Then run client application.



About HostForLIFE.eu

HostForLIFE.eu is European Windows Hosting Provider which focuses on Windows Platform only. We deliver on-demand hosting solutions including Shared hosting, Reseller Hosting, Cloud Hosting, Dedicated Servers, and IT as a Service for companies of all sizes.

We have offered the latest Windows 2016 Hosting, ASP.NET Core 2.2.1 Hosting, ASP.NET MVC 6 Hosting and SQL 2017 Hosting.


Tag cloud

Sign in