just add this line in system.serviceModel
Accessing a Shared File (UNC) From a Remote, Non-Trusted Domain With Credentials
using System; using System.Runtime.InteropServices; using System.ComponentModel; namespace YourNameSpace { ////// Provides access to a network share. /// public class NetworkShareAccesser : IDisposable { private string _remoteUncName; private string _remoteComputerName; public string RemoteComputerName { get { return this._remoteComputerName; } set { this._remoteComputerName = value; this._remoteUncName = @"\\" + this._remoteComputerName; } } public string UserName { get; set; } public string Password { get; set; } #region Consts private const int RESOURCE_CONNECTED = 0x00000001; private const int RESOURCE_GLOBALNET = 0x00000002; private const int RESOURCE_REMEMBERED = 0x00000003; private const int RESOURCETYPE_ANY = 0x00000000; private const int RESOURCETYPE_DISK = 0x00000001; private const int RESOURCETYPE_PRINT = 0x00000002; private const int RESOURCEDISPLAYTYPE_GENERIC = 0x00000000; private const int RESOURCEDISPLAYTYPE_DOMAIN = 0x00000001; private const int RESOURCEDISPLAYTYPE_SERVER = 0x00000002; private const int RESOURCEDISPLAYTYPE_SHARE = 0x00000003; private const int RESOURCEDISPLAYTYPE_FILE = 0x00000004; private const int RESOURCEDISPLAYTYPE_GROUP = 0x00000005; private const int RESOURCEUSAGE_CONNECTABLE = 0x00000001; private const int RESOURCEUSAGE_CONTAINER = 0x00000002; private const int CONNECT_INTERACTIVE = 0x00000008; private const int CONNECT_PROMPT = 0x00000010; private const int CONNECT_REDIRECT = 0x00000080; private const int CONNECT_UPDATE_PROFILE = 0x00000001; private const int CONNECT_COMMANDLINE = 0x00000800; private const int CONNECT_CMD_SAVECRED = 0x00001000; private const int CONNECT_LOCALDRIVE = 0x00000100; #endregion #region Errors private const int NO_ERROR = 0; private const int ERROR_ACCESS_DENIED = 5; private const int ERROR_ALREADY_ASSIGNED = 85; private const int ERROR_BAD_DEVICE = 1200; private const int ERROR_BAD_NET_NAME = 67; private const int ERROR_BAD_PROVIDER = 1204; private const int ERROR_CANCELLED = 1223; private const int ERROR_EXTENDED_ERROR = 1208; private const int ERROR_INVALID_ADDRESS = 487; private const int ERROR_INVALID_PARAMETER = 87; private const int ERROR_INVALID_PASSWORD = 1216; private const int ERROR_MORE_DATA = 234; private const int ERROR_NO_MORE_ITEMS = 259; private const int ERROR_NO_NET_OR_BAD_PATH = 1203; private const int ERROR_NO_NETWORK = 1222; private const int ERROR_BAD_PROFILE = 1206; private const int ERROR_CANNOT_OPEN_PROFILE = 1205; private const int ERROR_DEVICE_IN_USE = 2404; private const int ERROR_NOT_CONNECTED = 2250; private const int ERROR_OPEN_FILES = 2401; #endregion #region PInvoke Signatures [DllImport("Mpr.dll")] private static extern int WNetUseConnection( IntPtr hwndOwner, NETRESOURCE lpNetResource, string lpPassword, string lpUserID, int dwFlags, string lpAccessName, string lpBufferSize, string lpResult ); [DllImport("Mpr.dll")] private static extern int WNetCancelConnection2( string lpName, int dwFlags, bool fForce ); [StructLayout(LayoutKind.Sequential)] private class NETRESOURCE { public int dwScope = 0; public int dwType = 0; public int dwDisplayType = 0; public int dwUsage = 0; public string lpLocalName = ""; public string lpRemoteName = ""; public string lpComment = ""; public string lpProvider = ""; } #endregion ////// Creates a NetworkShareAccesser for the given computer name. The user will be promted to enter credentials /// /// ///public static NetworkShareAccesser Access(string remoteComputerName) { return new NetworkShareAccesser(remoteComputerName); } /// /// Creates a NetworkShareAccesser for the given computer name using the given domain/computer name, username and password /// /// /// /// /// public static NetworkShareAccesser Access(string remoteComputerName, string domainOrComuterName, string userName, string password) { return new NetworkShareAccesser(remoteComputerName, domainOrComuterName + @"\" + userName, password); } ////// Creates a NetworkShareAccesser for the given computer name using the given username (format: domainOrComputername\Username) and password /// /// /// /// public static NetworkShareAccesser Access(string remoteComputerName, string userName, string password) { return new NetworkShareAccesser(remoteComputerName, userName, password); } private NetworkShareAccesser(string remoteComputerName) { RemoteComputerName = remoteComputerName; this.ConnectToShare(this._remoteUncName, null, null, true); } private NetworkShareAccesser(string remoteComputerName, string userName, string password) { RemoteComputerName = remoteComputerName; UserName = userName; Password = password; this.ConnectToShare(this._remoteUncName, this.UserName, this.Password, false); } private void ConnectToShare(string remoteUnc, string username, string password, bool promptUser) { NETRESOURCE nr = new NETRESOURCE { dwType = RESOURCETYPE_DISK, lpRemoteName = remoteUnc }; int result; if (promptUser) { result = WNetUseConnection(IntPtr.Zero, nr, "", "", CONNECT_INTERACTIVE | CONNECT_PROMPT, null, null, null); } else { result = WNetUseConnection(IntPtr.Zero, nr, password, username, 0, null, null, null); } if (result != NO_ERROR) { throw new Win32Exception(result); } } private void DisconnectFromShare(string remoteUnc) { int result = WNetCancelConnection2(remoteUnc, CONNECT_UPDATE_PROFILE, false); if (result != NO_ERROR) { throw new Win32Exception(result); } } ////// Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources. /// ///2 public void Dispose() { this.DisconnectFromShare(this._remoteUncName); } } }
using
using (NetworkShareAccesser.Access(server, Config.Domain, Config.User, Config.Pass)) { return System.IO.File.ReadAllText(res.path); }
ASP NET Compression Caching
modify web.config
add attribute where it requers
[OutputCache(Duration = int.MaxValue, VaryByParam = "none")] public ActionResult Index() { return View(); }
ASP .NET MVC 5 Validation and Way to change standard validation message
my view
1 Add folder
2 Create resource file
3 Add new value (We can override 4 types of messages FieldMustBeDate, FieldMustBeNumeric, PropertyValueInvalid andPropertyValueRequired)
4 And add one line to your Global.asax.cs
@model Riski.Models.Koef @using (Html.BeginForm()) { @Html.AntiForgeryToken()my controller}@Model.name
@Html.ValidationSummary(true, "", new { @class = "text-danger" })
@Html.LabelFor(model => model.koef1, htmlAttributes: new { @class = "control-label col-md-2" })@Html.HiddenFor(model => model.id) @Html.HiddenFor(model => model.name)
@Html.EditorFor(model => model.koef1, new { @class = "form-control" }) @Html.ValidationMessageFor(model => model.koef1, "", new { @class = "text-danger" })
@Html.ActionLink("Вернуться к списку", "Index")@section scripts{ @Scripts.Render("~/bundles/jqueryval") }
[HttpPost] public ActionResult Edit(Koef koef) { if (ModelState.IsValid) { db.Configuration.ValidateOnSaveEnabled = false; db.Koefs.Attach(koef); var entry = db.Entry(koef); entry.Property(e => e.koef1).IsModified = true; db.SaveChanges(); return RedirectToAction("Index"); } return View(koef); }this is a partial class wich helps us to validate our model. Acording to this approach we don't need to add Validation Attributies after every process of generation Entity classes
using System; using System.ComponentModel.DataAnnotations; namespace Riski.Models { [MetadataType(typeof(KoefViewModel))] public partial class Koef { } public class KoefViewModel { [Required] [Display(Name = "Коэффициент")] [Range(0, 100, ErrorMessage = "Значение должно быть от 0 до 100.")] public NullableThat's it. Now , as this is a russian web-site, we need to override some standard validation messages. It's simple solution and we should do only for stepskoef1 { get; set; } [Required] public int id { get; set; } } }
1 Add folder
2 Create resource file
3 Add new value (We can override 4 types of messages FieldMustBeDate, FieldMustBeNumeric, PropertyValueInvalid andPropertyValueRequired)
4 And add one line to your Global.asax.cs
DefaultModelBinder.ResourceClassKey = "MyNewResource";
Creating stub methods using ShortCut in VS2013
http://dailydotnettips.com/2011/01/01/generate-method-stubs-using-shortcut-key-in-visual-studio/
just press "ctrl + ." and "Enter"
just press "ctrl + ." and "Enter"
c# run thread in threadpool
This is the way of running thread in ThreadPool
1 only for 4.5 Framework
1 only for 4.5 Framework
Task.Run(() => doStuff("hello world"));2
Task.Factory.StartNew(() => doStuff("hello world"));3
ThreadPool.QueueUserWorkItem(a => doStuff("hello world"));4
void Example() { // Hook up the ProcessFile method to the ThreadPool. // Note: 'a' is an argument name. Read more on arguments. ThreadPool.QueueUserWorkItem(new WaitCallback(ProcessFile), a); } private void ProcessFile(object a) { // I was hooked up to the ThreadPool by WaitCallback. }
Subscribe to:
Posts (Atom)