csharp 模拟HttpWebRequest - 测试类

模拟HttpWebRequest - 测试类

ExampleTest.cs
using NUnit.Framework;
using System;
using System.Net;

namespace LeeSoft.TestUtils
{
    [TestFixture]
    public class ExampleTest
    {
        [Test]
        public void CanRequestData()
        {
            const string testUri = "http://api.somesite.com/Traffic/thing.ashx?Action=GetSecurityToken";
            const string expectedResponse = "<thing>Some data</thing>";

            WebRequest.RegisterPrefix(testUri, new CustomWebRequest());
            CustomWebRequest.CreateRequestWithResponse(expectedResponse);

            var sut = new ExampleClass();
            var data = sut.RequestData(new Uri(testUri));

            Assert.AreEqual(expectedResponse, data);
        }
    }
}

csharp 模拟HttpWebRequest - CustomWebRequest

模拟HttpWebRequest - CustomWebRequest

CustomWebRequest.cs
using Moq;
using System;
using System.IO;
using System.Net;
using System.Text;

namespace LeeSoft.TestUtils
{
    public class CustomWebRequest : IWebRequestCreate
    {
        public static WebRequest NextRequest { get; set; }

        public WebRequest Create(Uri uri)
        {
            return NextRequest;
        }

        public static HttpWebRequest CreateRequestWithResponseCode(HttpStatusCode httpStatusCode)
        {
            var response = new Mock<HttpWebResponse>(MockBehavior.Loose);
            response.Setup(c => c.StatusCode).Returns(httpStatusCode);

            var request = new Mock<HttpWebRequest>();
            request.Setup(s => s.GetResponse()).Returns(response.Object);
            NextRequest = request.Object;
            return request.Object;
        }

        public static HttpWebRequest CreateRequestWithResponse(string responseContent)
        {
            var response = new Mock<HttpWebResponse>(MockBehavior.Loose);
            var responseStream = new MemoryStream(Encoding.UTF8.GetBytes(responseContent));
            response.Setup(c => c.StatusCode).Returns(HttpStatusCode.OK);
            response.Setup(c => c.GetResponseStream()).Returns(responseStream);

            var request = new Mock<HttpWebRequest>();
            request.Setup(s => s.GetResponse()).Returns(response.Object);
            NextRequest = request.Object;

            return request.Object;
        }
    }
}

csharp Enviar un fichero来自FTP usando C#para .NET

Enviar un fichero来自FTP usando C#para .NET

sendFtp.cs
string ftpServerIP = "ftp.example.com";
string ftpUserName = "username";
string ftpPassword = "password";
string filename = Server.MapPath("example.txt");
		
FileInfo objFile = new FileInfo(filename);

FtpWebRequest objFTPRequest;

// Create FtpWebRequest object 
objFTPRequest = (FtpWebRequest)FtpWebRequest.Create(new Uri("ftp://" + ftpServerIP + "/" + objFile.Name));

// Set Credintials
objFTPRequest.Credentials = new NetworkCredential(ftpUserName, ftpPassword);

// By default KeepAlive is true, where the control connection is 
// not closed after a command is executed.
objFTPRequest.KeepAlive = false;

// Set the data transfer type.
objFTPRequest.UseBinary = true;

// Set content length
objFTPRequest.ContentLength = objFile.Length;

// Set request method
objFTPRequest.Method = WebRequestMethods.Ftp.UploadFile;

// Set buffer size
int intBufferLength = 16 * 1024;
byte[] objBuffer = new byte[intBufferLength];

// Opens a file to read
FileStream objFileStream = objFile.OpenRead();
		
try
{
  // Get Stream of the file
  Stream objStream = objFTPRequest.GetRequestStream();
		
  int len = 0;
		
  while ((len = objFileStream.Read(objBuffer, 0, intBufferLength)) != 0)
  {
    // Write file Content 
    objStream.Write(objBuffer, 0, len);
    
  }
		
  objStream.Close();
  objFileStream.Close();
  
} catch (Exception ex) {

  throw ex;
  
}	

csharp 模拟HttpWebRequest - SUT

模拟HttpWebRequest - SUT

ExampleClass.cs
using System;
using System.IO;
using System.Net;

namespace LeeSoft.TestUtils
{
    public class ExampleClass
    {
        public string RequestData(Uri uri)
        {
            var response = CreateWebRequest(uri).GetResponse();
            var responseStream = response.GetResponseStream();

            if (responseStream == null) return null;

            string responseData;
            using (var reader = new StreamReader(responseStream))
            {
                responseData = reader.ReadToEnd();
            }

            return responseData;
        }

        private static HttpWebRequest CreateWebRequest(Uri uri)
        {
            var request = WebRequest.Create(uri) as HttpWebRequest;

            if (request == null) return null;

            request.ContentType = "text/xml;charset=\"utf-8\"";
            request.Method = "GET";
            request.Timeout = 1000;
            request.Credentials = CredentialCache.DefaultNetworkCredentials;

            return request;
        }
    }
}

csharp 此类添加一个文件>场景自动加载菜单,其中包含用于选择“主场景”的选项,使其能够在用户按下时自动加载

此类添加了一个“文件”>“场景自动加载”菜单,其中包含用于选择“主场景”的选项,使其能够在用户在编辑器中按下播放时自动加载。启用后,所选场景将在播放时加载,然后原始场景将在停止时重新加载。

SceneAutoLoader.cs
using UnityEngine;
using UnityEditor;

/// <summary>
/// Scene auto loader.
/// </summary>
/// <description>
/// This class adds a File > Scene Autoload menu containing options to select
/// a "master scene" enable it to be auto-loaded when the user presses play
/// in the editor. When enabled, the selected scene will be loaded on play,
/// then the original scene will be reloaded on stop.
///
/// Based on an idea on this thread:
/// http://forum.unity3d.com/threads/157502-Executing-first-scene-in-build-settings-when-pressing-play-button-in-editor
/// </description>
[InitializeOnLoad]
static class SceneAutoLoader
{
    // Static constructor binds a playmode-changed callback.
    // [InitializeOnLoad] above makes sure this gets executed.
    static SceneAutoLoader()
    {
        EditorApplication.playmodeStateChanged += OnPlayModeChanged;
    }

    // Menu items to select the "master" scene and control whether or not to load it.
    [MenuItem("File/Scene Autoload/Select Master Scene...")]
    private static void SelectMasterScene()
    {
        string masterScene = EditorUtility.OpenFilePanel("Select Master Scene", Application.dataPath, "unity");
        if (!string.IsNullOrEmpty(masterScene))
        {
            MasterScene = masterScene;
            LoadMasterOnPlay = true;
        }
    }

    [MenuItem("File/Scene Autoload/Load Master On Play", true)]
    private static bool ShowLoadMasterOnPlay()
    {
        return !LoadMasterOnPlay;
    }
    [MenuItem("File/Scene Autoload/Load Master On Play")]
    private static void EnableLoadMasterOnPlay()
    {
        LoadMasterOnPlay = true;
    }

    [MenuItem("File/Scene Autoload/Don't Load Master On Play", true)]
    private static bool ShowDontLoadMasterOnPlay()
    {
        return LoadMasterOnPlay;
    }
    [MenuItem("File/Scene Autoload/Don't Load Master On Play")]
    private static void DisableLoadMasterOnPlay()
    {
        LoadMasterOnPlay = false;
    }

    // Play mode change callback handles the scene load/reload.
    private static void OnPlayModeChanged()
    {
        if (!LoadMasterOnPlay)
        {
            return;
        }

        if (!EditorApplication.isPlaying && EditorApplication.isPlayingOrWillChangePlaymode)
        {
            // User pressed play -- autoload master scene.
            PreviousScene = EditorApplication.currentScene;
            if (EditorApplication.SaveCurrentSceneIfUserWantsTo())
            {
                if (!EditorApplication.OpenScene(MasterScene))
                {
                    Debug.LogError(string.Format("error: scene not found: {0}", MasterScene));
                    EditorApplication.isPlaying = false;
                }
            }
            else
            {
                // User cancelled the save operation -- cancel play as well.
                EditorApplication.isPlaying = false;
            }
        }
        if (EditorApplication.isPlaying && !EditorApplication.isPlayingOrWillChangePlaymode)
        {
            // User pressed stop -- reload previous scene.
            if (!EditorApplication.OpenScene(PreviousScene))
            {
                Debug.LogError(string.Format("error: scene not found: {0}", PreviousScene));
            }
        }
    }

    // Properties are remembered as editor preferences.
    private const string cEditorPrefLoadMasterOnPlay = "SceneAutoLoader.LoadMasterOnPlay";
    private const string cEditorPrefMasterScene = "SceneAutoLoader.MasterScene";
    private const string cEditorPrefPreviousScene = "SceneAutoLoader.PreviousScene";

    private static bool LoadMasterOnPlay
    {
        get { return EditorPrefs.GetBool(cEditorPrefLoadMasterOnPlay, false); }
        set { EditorPrefs.SetBool(cEditorPrefLoadMasterOnPlay, value); }
    }

    private static string MasterScene
    {
        get { return EditorPrefs.GetString(cEditorPrefMasterScene, "Master.unity"); }
        set { EditorPrefs.SetString(cEditorPrefMasterScene, value); }
    }

    private static string PreviousScene
    {
        get { return EditorPrefs.GetString(cEditorPrefPreviousScene, EditorApplication.currentScene); }
        set { EditorPrefs.SetString(cEditorPrefPreviousScene, value); }
    }
}

csharp ASP.net MVC4分页列表

ASP.net MVC4分页列表

usage.cshtml
@model TPTemplate.Web.ViewModels.PaginatedList
@using TPTemplate.Web.Extensions

@Html.PaginationLinksFor(Model, p => Url.Action("Index", new { page = p }))
PaginationExtensions.cs
using System;
using System.Text;
using System.Web.Mvc;
using TPTemplate.Web.ViewModels;

namespace TPTemplate.Web.Extensions
{
    public static class PaginationExtensions
    {
        public static MvcHtmlString PaginationLinksFor(this HtmlHelper html, IPaginatedList paginatedList,
            Func<int, string> pageUrl, bool showFirstAndLast = true, bool showNextAndPrevious = true, int maxVisiblePages = 10)
        {
            var result = new StringBuilder();

            var ul = new TagBuilder("ul");
            ul.AddCssClass("pagination");

            result.Append(ul.ToString(TagRenderMode.StartTag));

            if (showFirstAndLast)
            {
                var firstPageLi = new TagBuilder("li");
                var firstPageA = new TagBuilder("a");
                firstPageA.MergeAttribute("href", pageUrl(1));
                firstPageA.InnerHtml = "&laquo;";

                if (paginatedList.CurrentPage == 1)
                {
                    firstPageLi.AddCssClass("disabled");
                }

                result.Append(firstPageLi.ToString(TagRenderMode.StartTag));
                result.Append(firstPageA.ToString(TagRenderMode.Normal));
                result.Append(firstPageLi.ToString(TagRenderMode.EndTag));
            }


            if (showNextAndPrevious)
            {
                var previousPageLi = new TagBuilder("li");
                var previousPageA = new TagBuilder("a");
                previousPageA.MergeAttribute("href", pageUrl(paginatedList.CurrentPage > 1 ? paginatedList.CurrentPage - 1 : 1));
                previousPageA.InnerHtml = "&lt;";

                if (paginatedList.CurrentPage == 1)
                {
                    previousPageLi.AddCssClass("disabled");
                }

                result.Append(previousPageLi.ToString(TagRenderMode.StartTag));
                result.Append(previousPageA.ToString(TagRenderMode.Normal));
                result.Append(previousPageLi.ToString(TagRenderMode.EndTag));
            }

            var start = 1;
           
            if (paginatedList.TotalPages > maxVisiblePages)
            {
                start = paginatedList.CurrentPage - (maxVisiblePages/2);

                if (start < 1)
                {
                    start = 1;
                }

                if (start > (paginatedList.TotalPages - maxVisiblePages))
                {
                    start = paginatedList.TotalPages - maxVisiblePages + 1;
                }
            }

            if (start > 1)
            {
                var lessLi = new TagBuilder("li");
                var lessA = new TagBuilder("a");
                lessA.MergeAttribute("href", pageUrl(paginatedList.CurrentPage > maxVisiblePages ? paginatedList.CurrentPage - maxVisiblePages : 1));
                lessA.InnerHtml = "...";
                result.Append(lessLi.ToString(TagRenderMode.StartTag));
                result.Append(lessA.ToString(TagRenderMode.Normal));
                result.Append(lessLi.ToString(TagRenderMode.EndTag));
            }

            for (var i = start; i <= paginatedList.TotalPages && i < start + maxVisiblePages; i++)
            {
                var li = new TagBuilder("li");

                var tag = new TagBuilder("a");
                tag.MergeAttribute("href", pageUrl(i));
                tag.InnerHtml = i.ToString();

                if (i == paginatedList.CurrentPage)
                {
                    li.AddCssClass("active");
                }

                result.Append(li.ToString(TagRenderMode.StartTag));
                result.Append(tag.ToString(TagRenderMode.Normal));
                result.Append(li.ToString(TagRenderMode.EndTag));
            }

            if (start + maxVisiblePages <= paginatedList.TotalPages)
            {
                var moreLi = new TagBuilder("li");
                var moreA = new TagBuilder("a");
                moreA.MergeAttribute("href", pageUrl(paginatedList.CurrentPage + maxVisiblePages > paginatedList.TotalPages ? paginatedList.TotalPages : paginatedList.CurrentPage + maxVisiblePages));
                moreA.InnerHtml = "...";
                result.Append(moreLi.ToString(TagRenderMode.StartTag));
                result.Append(moreA.ToString(TagRenderMode.Normal));
                result.Append(moreLi.ToString(TagRenderMode.EndTag));
            }

            if (showNextAndPrevious)
            {
                var nextPageLi = new TagBuilder("li");
                var nextPageA = new TagBuilder("a");
                nextPageA.MergeAttribute("href", pageUrl(paginatedList.CurrentPage < paginatedList.TotalPages ? paginatedList.CurrentPage + 1 : paginatedList.CurrentPage));
                nextPageA.InnerHtml = "&gt;";

                if (paginatedList.CurrentPage == paginatedList.TotalPages)
                {
                    nextPageLi.AddCssClass("disabled");
                }

                result.Append(nextPageLi.ToString(TagRenderMode.StartTag));
                result.Append(nextPageA.ToString(TagRenderMode.Normal));
                result.Append(nextPageLi.ToString(TagRenderMode.EndTag));
            }

            if (showFirstAndLast)
            {
                var lastPageLi = new TagBuilder("li");
                var lastPageA = new TagBuilder("a");
                lastPageA.MergeAttribute("href", pageUrl(paginatedList.TotalPages));
                lastPageA.InnerHtml = "&raquo;";

                if (paginatedList.CurrentPage == paginatedList.TotalPages)
                {
                    lastPageLi.AddCssClass("disabled");
                }

                result.Append(lastPageLi.ToString(TagRenderMode.StartTag));
                result.Append(lastPageA.ToString(TagRenderMode.Normal));
                result.Append(lastPageLi.ToString(TagRenderMode.EndTag));
            }

            result.Append(ul.ToString(TagRenderMode.EndTag));

            return MvcHtmlString.Create(result.ToString());
        }
    }
}
PaginateList.cs
using System;
using System.Collections;
using System.Collections.Generic;

namespace TPTemplate.Web.ViewModels
{
    public abstract class BasePaginatedList : IPaginatedList
    {
        public int TotalItems { get; set; }
        public int ItemsPerPage { get; set; }
        public int CurrentPage { get; set; }

        public int TotalPages
        {
            get
            {
                return (int)Math.Ceiling((decimal)TotalItems / ItemsPerPage);
            }
        }

        public int? NextPage
        {
            get
            {
                return (CurrentPage < TotalPages) ? CurrentPage + 1 : (int?)null;
            }
        }

        public int? PreviousPage
        {
            get
            {
                return (CurrentPage > 1) ? CurrentPage - 1 : (int?)null;
            }
        }
    }

    public class PaginatedList : BasePaginatedList
    {
        public IEnumerable Items { get; set; }

        public PaginatedList(IEnumerable items)
        {
            Items = items;
        }
    }

    public class PaginatedList<T> : BasePaginatedList where T:class
    {
        public IEnumerable<T> Items { get; set; }

        public PaginatedList(IEnumerable<T> items)
        {
            Items = items;
        }
    }
}
IPaginatedList.cs
using System;
using System.Collections;
using System.Collections.Generic;

namespace TPTemplate.Web.ViewModels
{
    public interface IPaginatedList
    {
        int TotalItems { get; set; }
        int ItemsPerPage { get; set; }
        int CurrentPage { get; set; }
        int TotalPages { get; }
        int? NextPage { get; }
        int? PreviousPage { get; }
    }
}
ExampleController.cs
public virtual ActionResult Index(int page = 1, int pageSize = 10)
{
    var work = UnitOfWork();
    int total;

    if (pageSize > MaxPageSize)
    {
        pageSize = MaxPageSize;
    }

    var models = work.Repository<TModel, TKey>()
        .Query()
        .OrderBy(Sort)
        .GetPage(page, pageSize, out total);

    return View(IndexView, new PaginatedList(Mapper.MapList(models).To<TListViewModel>())
    {
        CurrentPage = page,
        ItemsPerPage = pageSize,
        TotalItems = total
    });
}

csharp 微软翻译

微软翻译

ITranslator.cs
public interface ITranslator
{
    string Translate(string originalString, string originalLanguageIso, string targetLanguageIso);
}
AdmAccessToken.cs
public class AdmAccessToken
{
  public string access_token { get; set; }
  
  public string token_type { get; set; }
  
  public string expires_in { get; set; }
  
  public string scope { get; set; }
}
0_MicrosoftTranslator.cs
using System;
using System.Configuration;
using System.IO;
using System.Net;
using System.Runtime.Serialization.Json;
using System.Text;
using System.Web;
using Think.Formica.Extensions;

namespace Think.Formica.Translation
{
  public class MicrosoftTranslator : ITranslator
	{
		private string _clientID;
		private string _clientSecret;
		private string _translatorAccessUri;
		private string _accessHeader;
		private string _translatorUrl;
	
		public MicrosoftTranslator()
		{
			_translatorAccessUri = "https://datamarket.accesscontrol.windows.net/v2/OAuth2-13";
			_translatorUrl = "http://api.microsofttranslator.com/v2/Http.svc/Translate?text=";
			_clientID = "FormicaTestData";
			_clientSecret = "aJXPEJSKO2kOcC2mMdySE9SwK2pqBdjZ8MBTAjpTF00=";
		}
	
		public string ClientID
		{
			get { return _clientID ?? (_clientID = ConfigurationManager.AppSettings["Bing.ClientID"]); }
			set { _clientID = value; }
		}
	
		public string ClientSecret
		{
			get { return _clientSecret ?? (_clientSecret = ConfigurationManager.AppSettings["Bing.ClientSecret"]); }
			set { _clientSecret = value; }
		}
	
		public string TranslatorAccessUri
		{
			get { return _translatorAccessUri ?? (_translatorAccessUri = ConfigurationManager.AppSettings["Bing.AuthUrl"]); }
			set { _translatorAccessUri = value; }
		}
	
		public string TranslatorUrl
		{
			get { return _translatorUrl ?? (_translatorUrl = ConfigurationManager.AppSettings["Bing.TranslatorUrl"]); }
			set { _translatorUrl = value; }
		}
	
		private string GetAccessTokenheader()
		{
			var requestDetails = CreateTranslatorAuthUri();
	
			var webRequest = WebRequest.Create(TranslatorAccessUri);
			webRequest.ContentType = "application/x-www-form-urlencoded";
			webRequest.Method = "POST";
	
			var bytes = Encoding.ASCII.GetBytes(requestDetails);
	
			webRequest.ContentLength = bytes.Length;
			using (var outputStream = webRequest.GetRequestStream())
			{
				outputStream.Write(bytes, 0, bytes.Length);
			}
	
			var webResponse = (HttpWebResponse)webRequest.GetResponse();
	
			AdmAccessToken token = null;
			
			using (var stream = webResponse.GetResponseStream())
			{
				var serializer = new DataContractJsonSerializer(typeof(AdmAccessToken));
				if (stream != null) token = (AdmAccessToken)serializer.ReadObject(stream);
			}
	
			return (token != null) ? "Bearer " + token.access_token : null;
		}
	
		private string CreateTranslatorAuthUri()
		{
			var requestDetails = string.Format("grant_type=client_credentials&client_id={0}&client_secret={1}&scope=http://api.microsofttranslator.com", HttpUtility.UrlEncode(ClientID), HttpUtility.UrlEncode(ClientSecret));
			return requestDetails;
		}
	
		public string Translate(string textTobeTranslated, string languageFrom, string languageTo)
		{
			textTobeTranslated.ThrowIfNullOrEmpty("textTobeTranslated");
			languageFrom.ThrowIfNullOrEmpty("languageFrom");
			languageTo.ThrowIfNullOrEmpty("languageTo");
	
			var accessheader = _accessHeader ?? (_accessHeader = GetAccessTokenheader());
	
			var uri = CreateTranslatorUri(textTobeTranslated, languageFrom, languageTo);
	
			var translationWebRequest = WebRequest.Create(uri);
			translationWebRequest.Headers.Add("Authorization", accessheader);
	
			var response = translationWebRequest.GetResponse();
	
			string translatedText = null;
			var encode = Encoding.GetEncoding("utf-8");
			using (var stream = response.GetResponseStream())
				if (stream != null)
					using(var translatedStream = new StreamReader(stream, encode))
					{
						var xTranslation = new System.Xml.XmlDocument();
						xTranslation.LoadXml(translatedStream.ReadToEnd());
						translatedText = xTranslation.InnerText;
					}
	
			return translatedText;
		}
	
		private string CreateTranslatorUri(string textTobeTranslated, string languageFrom, string languageTo)
		{
			var uri = string.Format("{0}{1}&from={2}&to={3}", TranslatorUrl, HttpUtility.UrlEncode(textTobeTranslated), languageFrom, languageTo);
			return uri;
		}
	}
}

csharp モナドについて

モナドについて

monads.md
以下のサイトが非常に分かりやすい。

http://d.hatena.ne.jp/qtamaki/20130624/1372086242
HelloMonads.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

using System.Monads;

namespace MonadsSample
{
  class Program
  {
    static void Main(string[] args)
    {
      new Data() { Name = "hello", Age = 40 }.With(_ => _.Name)
                                             .With(_ => _.ToUpper())
                                             .Do(_ => Console.WriteLine(_))
                                             .With(_ => _.ToLower())
                                             .Do(_ => Console.WriteLine(_))
                                             .With(_ => Method1(_))
                                             .With(_ => _.ToUpper())
                                             .Do(_ => Console.WriteLine(_));
    }

    static string Method1(string value)
    {
      return value.Reverse().Return(_ => new string(_.ToArray()), string.Empty);
    }
  }

  public class Data
  {
    public string Name { get; set; }
    public int Age { get; set; }
  }
}

csharp HttpHandler的Sampe代码

HttpHandler的Sampe代码

httphander.cs
<%@ WebHandler Language="C#" Class="Handler" %>
using System;
using System.Web;
public class Handler : IHttpHandler {
    public void ProcessRequest (HttpContext context) {
        context.Response.ContentType = "html";
        context.Response.Write("Hello World");
        manaeform(context);
    }
    public void manaeform(HttpContext context)
    {
        context.Response.Write("<html><body><form>");
        context.Response.Write("<h2>Select your feature</h2>");
        if (context .Request .Params ["Feature"]==null)
        {
            context.Response.Write("<select name='Feature'>");
            context.Response.Write("<option>asp.net </option>");
            context.Response.Write("<option>java </option>");
            context.Response.Write("</select></form></body></html>");
        }
    }
    public bool IsReusable {
        get {
            return false;
        }
    }
}

csharp 使用工厂模式创建命令实例。

使用工厂模式创建命令实例。

CommandFactory.cs
namespace AppName.LogicaDeNegocio.FabricaComando
{
    public class CommandFactory
    {
        
        #region Estado

        public static Comando.Comando CrearComandoConsultarEstado(Entidad recibidor)
        {
            return new ComandoConsultarEstado(recibidor);
        }

        #endregion
        
    }
}