リモートパーティがトランスポートストリームを終了したため、認証に失敗しました。

表題のエラーが発生。

‘/’ アプリケーションでサーバー エラーが発生しました。

説明: 現在の Web 要求を実行中に、ハンドルされていない例外が発生しました。エラーに関する詳細および例外の発生場所については、スタック トレースを参照してください。 

例外の詳細: System.IO.IOException: リモート パーティがトランスポート ストリームを終了したため、認証に失敗しました

スタック トレース:

[IOException: リモート パーティがトランスポート ストリームを終了したため、認証に失敗しました。] System.Net.Security.SslState.StartReadFrame(Byte[] buffer, Int32 readBytes, AsyncProtocolRequest asyncRequest) +6803088 System.Net.Security.SslState.StartReceiveBlob(Byte[] buffer, AsyncProtocolRequest asyncRequest) +132 System.Net.Security.SslState.CheckCompletionBeforeNextReceive(ProtocolToken message, AsyncProtocolRequest asyncRequest) +281 System.Net.Security.SslState.StartSendBlob(Byte[] incoming, Int32 count, AsyncProtocolRequest asyncRequest) +49 System.Net.Security.SslState.ForceAuthentication(Boolean receiveFirst, Byte[] buffer, AsyncProtocolRequest asyncRequest) +162 System.Net.Security.SslState.ProcessAuthentication(LazyAsyncResult lazyResult) +542 System.Net.TlsStream.CallProcessAuthentication(Object state) +42 System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx) +228 System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx) +21 System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state) +64 System.Net.TlsStream.ProcessAuthentication(LazyAsyncResult result) +795 System.Net.TlsStream.Write(Byte[] buffer, Int32 offset, Int32 size) +52 System.Net.PooledStream.Write(Byte[] buffer, Int32 offset, Int32 size) +21 System.Net.ConnectStream.WriteHeaders(Boolean async) +388

[WebException: 接続が切断されました: 送信時に、予期しないエラーが発生しました。。] System.Net.HttpWebRequest.GetResponse() +1399 System.Xml.XmlDownloadManager.GetNonFileStream(Uri uri, ICredentials credentials, IWebProxy proxy, RequestCachePolicy cachePolicy) +83 System.Xml.XmlDownloadManager.GetStream(Uri uri, ICredentials credentials, IWebProxy proxy, RequestCachePolicy cachePolicy) +99 System.Xml.XmlUrlResolver.GetEntity(Uri absoluteUri, String role, Type ofObjectToReturn) +69 System.Xml.XmlTextReaderImpl.FinishInitUriString() +76 System.Xml.XmlTextReaderImpl..ctor(String uriStr, XmlReaderSettings settings, XmlParserContext context, XmlResolver uriResolver) +186 System.Xml.XmlReaderSettings.CreateReader(String inputUri, XmlParserContext inputContext) +66 System.Xml.XmlReader.Create(String inputUri, XmlReaderSettings settings, XmlParserContext inputContext) +45 System.Xml.Linq.XDocument.Load(String uri, LoadOptions options) +45 h

原因は、XDocument.Load で読み込んでいたrssのサービスが終了していたため。

ASP.NET MVC でパラメータを渡す方法

 

Global.asax.cs でパラメータを3つ設定

public static void RegisterRoutes(RouteCollection routes)
{
    routes.IgnoreRoute(“{resource}.axd/{*pathInfo}”);

    routes.MapRoute(
        “Default”, // ルート名
        “{controller}/{action}/{p1}/{p2}/{p3}”, // パラメーター付きの URL
        new { controller = “Home”, action = “Index”,
              P1 = UrlParameter.Optional,
              P2 = UrlParameter.Optional,
              P3 = UrlParameter.Optional
        } // パラメーターの既定値
    );

}

HomeController.cs で、パラメータをViewData にセット。このとき、UrlParameter.Optional としているので、int, float はそれぞれ nullable にしておかないとエラーになる。

public ActionResult Index(string p1, int? p2, float? p3)
{
    ViewBag.Message = “ASP.NET MVC へようこそ”;
    ViewData[“p1”] = p1;
    ViewData[“p2”] = p2;
    ViewData[“p3”] = p3;
    return View();
}

index.cshtmlで、

    <p>p1 = @ViewData[“p1”]</p>
    <p>p2 = @ViewData[“p2”]</p>
    <p>p3 = @ViewData[“p3”]</p>

とする。

次のULRでの文字列、int, float も正しい型で処理されている。

http://…/Home/Index/文字列/123/3.1419e-3

image

ASP.NET MVC ActionResultの派生型

http://msdn.microsoft.com/ja-jp/magazine/dd695917.aspx

「ASP.NET MVC Controller の動作」より、ActionResult のディライブドクラスを抜き出したもの。

名前 フレームワークの動作 生成メソッド
ContentResult 文字列値を HTTP 応答に直接書き込みます。 Content
EmptyResult HTTP 応答に書き込みません。  
FileContentResult ファイルの内容 (バイトの配列として表される) を取得し、HTTP 応答に書き込みます。 File
FilePathResult 指定した場所にあるファイルの内容を取得し、HTTP 応答に書き込みます。 File
FileStreamResult コントローラによって生成されたファイル ストリームを取得し、HTTP 応答に書き込みます。 File
HttpUnauthorizedResult 承認チェックが失敗したときに承認フィルタによって使用される特殊な= 結果です。  
JavaScriptResult クライアントが実行するスクリプトをクライアントに返します。 JavaScript
JsonResult JavaScript Object Notation (JSON) のデータをクライアントに返します。 Json
RedirectResult クライアントを新しい URL にリダイレクトします。 Redirect
RedirectToRouteResult 指定されたビューをレンダリングして HTML フラグメントを返します (通常は AJAX のシナリオで使用されます)。 RedirectToRoute / RedirectToAction
PartialViewResult 指定されたビューをレンダリングして HTML フラグメントを返します (通常は AJAX のシナリオで使用されます)。 PartialView
ViewResult 指定されたビューをレンダリングして HTML をクライアントに返します。 View

ASP.NET MVC 3 JPN

PI3 の説明ページより引用

「Microsoft Web Platform Installer 3.0 (Web PI) は Internet Information Services (IIS)、 SQL Server Express、 .NET Framework そして Visual Web Developer といったマイクロソフトの Web プラットフォームにおける最新のコンポーネントを簡単に入手するための無償のツールです。加えて、 Web PI では Windows Web アプリケーション ギャラリーに登録されている CMS やブログを構築するための無償の Web アプリケーションを簡単にインストールすることが可能です。」

ということで、PI3.0 を使って、ASP.NET MVC 3 を入れてみる。

image

ASP.NET MVC 3(英語) を選択し、追加

image

ライセンスの確認画面で同意する

image

ASP.NET MVC 3のインストール開始

image

インストールされたコンポーネント群。

image

そういえば、これは英語版なので、日本語パッケージがない。

そこで、MSDN から、AspNetMVC3Setup_JPN.exe をダウンロードしてくる。

http://www.microsoft.com/downloads/details.aspx?FamilyID=d2928bc1-f48c-4e95-a064-2a455a22c8f6&displayLang=ja

image

そして、最終的にこれだけのコンポーネントがインストールされる。

image

このあたりのことは、
ASP.NET MVC 3 日本語版公開と、いくつかの改善点について …

http://blogs.msdn.com/b/chack/archive/2011/01/22/asp-net-mvc-3-japanese-package-and-some-issue-on-localized-package.aspx

に詳しく書かれている。

ローカライズの笑えぬ翻訳~「View」 を「表示」 ってのも、結構涙目。

MVC 3 入れる前のプロジェクトテンプレート

MVC 3 を入れる前のプロジェクトテンプレートを記念?にスクリーンショット

image

さて、MVC 3を入れるとどうなるか・・・

単に MVC 3 が増えただけだったw

image

しかし、MVC 3を選ぶと、Razor ビュー エンジンがもれなくついてくる。

image

Razor で、ようやくMVCを使う気になってきた。

ASP.NET MVC で LINQ to XML

環境; Windows 7 x64 Ultimate, Visual Studio 2010 Ultimate, .Net Framework 4.0, MVC 2

http://dailynews.yahoo.co.jp/fc/rss.xml

にあるRSSデータをLINQで読み込み、MVC2で表示させる。

RSSデータは、次のような感じ。

http://backend.userland.com/blogChannelModule”>
<channel>   
<title>Yahoo!ニュース・トピックス – トップ</title>
<link>
http://dailynews.yahoo.co.jp/fc/</link>
<description>Yahoo! JAPANのニュース・トピックスで取り上げている最新の見出しを提供しています。</description>
<language>ja</language>
<pubDate>Sun, 30 Jan 2011 13:43:46 +0900</pubDate>

<item>
<title>民主党綱領めぐり主導権争い</title>
<link>
http://rd.yahoo.co.jp/rss/l/topics/topics/*http://dailynews.yahoo.co.jp/fc/domestic/politics/</link>
<pubDate>Sat, 29 Jan 2011 13:37:45 +0900</pubDate>
<guid isPermaLink=”false”>yahoo/news/topics/3494716</guid>
</item>

<item>
<title>邦人500人が足止め エジプト</title>
<link>
http://rd.yahoo.co.jp/rss/l/topics/topics/*http://dailynews.yahoo.co.jp/fc/world/overseas_japanese/</link>
<pubDate>Sun, 30 Jan 2011 11:39:52 +0900</pubDate>
<guid isPermaLink=”false”>yahoo/news/topics/3501016</guid>
</item>

———————————–

1. MVC2 の新規プロジェクト作成

2. ソリューションエクスプローラーから、Contoller を右クリックし、コントローラの追加を選択

image

3. YahooRssController を追加

image

4. YahooRssController.cs に次のコードを実装

using System.Collections.Generic;
using System.Web;
using System.Web.Mvc;
using System.Xml.Linq;
using System.Linq;

namespace MvcApplication3.Controllers
{
    public class YahooRssController : Controller
    {
        //
        // GET: /YahooRss/

        public ActionResult Index()
        {
            var res = new List<YahooRss>();

            ViewData[“Message”] = “ASP.NET MVC へようこそ”;

            string yahooRssUrl = “http://dailynews.yahoo.co.jp/fc/rss.xml”;
            XDocument rss = XDocument.Load(yahooRssUrl);

            res = (from item in rss.Descendants(“item”)
                   select new YahooRss
                   {
                       title = (item.Element(“title”).Value ?? “”),
                       link = item.Element(“link”).Value,
                       pubDate = item.Element(“pubDate”).Value,
                       guid = item.Element(“guid”).Value
                   }).ToList();

            return View(res);
        }

        public class YahooRss
        {
            public string title { get; set; }
            public string link { get; set; }
            public string pubDate { get; set; }
            public string guid { get; set; }
        }
    }
}

6.  ビューを追加

コードエディタの public ActionResult Index() のスコープ内を右クリックして、ビューの追加を選択

image

すると、次のようなビューの追加ダイアログが表示されるので、そのまま Index というビューを追加する。

image

7.  ビューの実装

<ul></ul>ブロック内を実装する。

<%@ Page Language=”C#” Inherits=”System.Web.Mvc.ViewPage<dynamic>” %>

<!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>Index</title>
</head>
<body>
    <div>
             <ul>
          <% foreach (var res in Model)
             {  %>
               <li> <a href=<%=Html.Encode(res.link) %>><%=Html.Encode(res.title) %></a> </li>
          <% } %>
     </ul>
    </div>
</body>
</html>

8. 実行すると・・・

http://localhost:1852/YahooRss/Index というURLに対して、次のようになる。1852 は実行環境によって違います。

image

ポイントは、View で表示する際に、

var res = from item in rss.Descendants(“item”)
select new
{
   …
}

という形だと、View 側で、Model の型がわからず、実行時エラーになってしまう。

そこで、Contoller で、public class YahooRss というクラスで明示的に定義して、

var res = new List<YahooRss>();
res = (from item in rss.Descendants(“item”)
                   select new YahooRss
                   {
                       title = (item.Element(“title”).Value ?? “”),
                       link = item.Element(“link”).Value,
                       pubDate = item.Element(“pubDate”).Value,
                       guid = item.Element(“guid”).Value
                   }).ToList();

というように、データを渡してあげること。

このことに関しては、次のURLを参考にしました。

Using ASP.NET MVC 2 to Query Twitter’s Public API – FIFA 2010

http://www.dotnetcurry.com/ShowArticle.aspx?ID=536&AspxAutoDetectCookieSupport=1

XML Web Service の呼び出し

CPUの温度を取得する際、WebClient を使用した、非同期呼び出し。

なお、Silverlight 3 Beta では、linq がサポートされていないので動かない。

///////////

WebClient client = new WebClient();

string request = "<soap:Envelope xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\"  xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\">  <soap:Body><CPUTemperatureStringResponse xmlns=\"http://tempuri.org/\">      <CPUTemperatureStringResult>float</CPUTemperatureStringResult>    </CPUTemperatureStringResponse></soap:Body></soap:Envelope>";

client.Headers.Add(HttpRequestHeader.ContentType, "text/xml");

client.Headers.Add("SOAPAction", "http://tempuri.org/CPUTemperature");

client.UploadStringCompleted += delegate(Object sender2, UploadStringCompletedEventArgs ev)
{
    XNamespace soap="http://schemas.xmlsoap.org/soap/envelope/";
    XNamespace xsi="http://www.w3.org/2001/XMLSchema-instance";
    XNamespace xsd="http://www.w3.org/2001/XMLSchema";
    XNamespace xst = "http://tempuri.org/";

    XDocument xmlHeadlines = XDocument.Parse(ev.Result);
    var headlines = from story in xmlHeadlines.Descendants(xst + "CPUTemperatureResult") select story;

    string temp = headlines.First().Value;

    TextBox1.Text = temp;
};

client.UploadStringAsync(new Uri("http://localhost/SystemTemperature/Temperature.asmx"), request);

CPUの温度取得に関するメモ6

WinRing0 を利用した Web Service のビルド環境の構築まとめ (Vista 32bit版)

  1. Visual Studio 2008 を管理者モードで起動
  2. ASP.NET Web サービスアプリケーションのプロジェクトを作成
  3. OpenLibSys.cs を追加
  4. WinRing0 は管理者で実行する必要があるため、Web.Config で Administrator に偽装するためのコードを追加
    <configuration>
      <system.web>
        <identity impersonate="true" userName="ホスト名\Administrator" password="パスワード" />
  5. デバッグ環境時の DLL 参照パス C:\Program Files\Common Files\Microsoft Shared\DevServer\9.0 に WinRing0.sys と WinRing0.dll をコピーする。
  6. IIS実行環境時の DLL 参照パス c:\windows\system32\inetsrv に WinRing0.sys と WinRing0.dll をコピーする。

CPUの温度取得に関するメモ5

Web Service から OpenLibSys を呼び出すと、InitializeOls(); を呼ぶところでOLS_DLL_DRIVER_NOT_FOUND エラーになってしまう。

この原因は、WinRing0.sys を Visual Studio のデバッグ環境で、Web Service から呼び出すときに、OlsDll.cpp の Initialize()関数の中で、ドライバーを呼び出すときのパスが、 “C:\Program Files\Common Files\Microsoft Shared\DevServer\9.0\WinRing0.sys” になってしまうためであることが判明した。暫定で、その場所に WinRing0.sys をコピーして先に進んでみる。

次に、Web Service をローカルの IIS に発行してみると、ドライバーを呼び出すときのパスが今度は、 “c:\windows\system32\inetsrv\WinRing0.sys” になってしまい、ドライバーを探しに行ってエラーになってしまう。そこに、WinRing0.sys をコピーすることで、Web Service から OpenLibSys を呼び出せるようになった。

image 

はまったメモ:

WinRing0が LoadLibrary で呼ばれていて、Web Service からデバッグできないので、ビルド環境を作って、メッセージを埋め込んでデバッグするしかなかった。もう少しいい方法があるのかな・・・

そこで、WinRin0\dll をビルドしてたら、DEF ファイルが外出しになっていて、リンカオプションに def ファイルを追加する必要があった。

/DEF:"C:\Users\uchukamen\Desktop\WinRing0_1_3_0\source\dll\OlsApi.def"

そこで、fprintf (stderr でと思ったが、出力先がないので、エラーを出せない。イベントログも面倒なので、とりあえず、ファイルにエラーメッセージを書き出した。

やっぱりワナがあった w

ここまでくれば、あとは OpenLibSys も気にせず、管理者モードに移行する必要もなく、簡単にアプリができる。ただ、OpenLibSys 強力な分、セキュリティ上注意が必要。