ラベル 開発 の投稿を表示しています。 すべての投稿を表示
ラベル 開発 の投稿を表示しています。 すべての投稿を表示

2015年10月13日火曜日

Azure Tableへのアクセス時にエラー:基礎になる接続が閉じられました: 送信時に、予期しないエラーが発生しました。

順調に稼働していたMicrosoft Azureのテーブルストレージへのアクセスですが,ある日突然エラーが発生するようになりました。

”基礎になる接続が閉じられました: 送信時に、予期しないエラーが発生しました。”
いろいろ調べてみた結果,同じアプリケーションの別の機能のところでSSLによるPOSTを行う際,余計なコードを入れてしまっていたことが原因と分かりました。

 ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3

AzureがSSL3.0サポートをやめたんですね。しっかり警告が出されていました。結構前に作成したコードですが,わざわざSSL3.0を指定したために発生したエラーでした。
ちなみにこのコードが動く部分でも送信先のサーバーがSSLを更新した際に以下のエラーが発生するようになりましたが,コードを削除すると正しく動作するようになりました。

”要求は中止されました: SSL/TLS のセキュリティで保護されているチャネルを作成できませんでした”
エラー発生部分ではテーブルストレージをまだ補助的なログ保存くらいにしか使っていなかったのでなんとかなっていましたが,やはりというか問題は自分のコードにありました。これでこれからも安心してAzureを使えます。

2015年5月21日木曜日

ActiveReports.NET9.0Jを使ってAzure Web AppsでPDFを生成する

Azure Webサイト(いまはWeb Appsでした)で運用しているASP.NET WebAPIでPDFを生成できるか試してみました。


コンポーネント: ActiveReports.NET 9.0J Professional (グレープシティ)
フレームワーク: .NET 4.5.1 ASP.NET MVC Web API 2
言語: VB.NET

9.0JではAzureに対応するとされていますが,"Microsoft Azure Virtual Machines"とあるので,Webサイトではどうかなと気になっていました。

まず,参照を追加します。すべてローカルにコピーするようにします。


"Reports"というフォルダーを作成して,その中にレポートファイルを作成します。テストなのでレポートはテキストラベルでも貼り付けて適当に作ります。ファイル名は以下のようにしました。

ページレポート: PageReport1.rdlx
セクションレポート: SectionReport1.vb


"Controllers"フォルダーの中に"ReportController.vb"を作成します。コードは以下のようなかんじです。


Imports System.Net
Imports System.Net.Http
Imports System.Net.Http.Headers
Imports System.Web.Http
Imports GrapeCity.ActiveReports
Imports GrapeCity.ActiveReports.Export.Pdf.Page


Public Class ReportController
    Inherits ApiController

     
    Public Function GetPagePdfTest() As HttpResponseMessage

        Dim res As New HttpResponseMessage(HttpStatusCode.OK)
        Dim rptpath = System.Web.Hosting.HostingEnvironment.MapPath("~/Reports/PageReport1.rdlx")
        Dim rpt = New PageReport(New System.IO.FileInfo(rptpath))
        Dim doc As Document.PageDocument

        Try
            doc = New Document.PageDocument(rpt)
        Catch eRunReport As ReportException
            res.StatusCode = HttpStatusCode.InternalServerError
            Return res
        End Try

        Dim pdfRenderingExtension As New PdfRenderingExtension()
        Dim outputProvider As New Rendering.IO.MemoryStreamProvider()
        doc.Render(pdfRenderingExtension, outputProvider)

        res.Headers.Add("ContentType", "application/pdf")
        Dim ms As New System.IO.MemoryStream()
        CType(outputProvider.GetPrimaryStream().OpenStream(), System.IO.MemoryStream).WriteTo(ms)
        res.Content = New ByteArrayContent(ms.ToArray)
        res.Content.Headers.ContentDisposition = New ContentDispositionHeaderValue("attachment")
        res.Content.Headers.ContentDisposition.FileName = "pagereport.pdf"
        res.Content.Headers.ContentType = New MediaTypeHeaderValue("application/pdf")

        Return res

    End Function

     
    Public Function GetSectionPdfTest() As HttpResponseMessage

        Dim res As New HttpResponseMessage(HttpStatusCode.OK)
        Dim rpt As New SectionReport1

        Try
            rpt.Run()
        Catch ex As ReportException
            res.StatusCode = HttpStatusCode.InternalServerError
            Return res
        End Try

        Dim ms As New System.IO.MemoryStream()
        Dim export As New Export.Pdf.Section.PdfExport

        Try
            export.Export(rpt.Document, ms)
        Catch ex As ReportException
            res.StatusCode = HttpStatusCode.InternalServerError
            Return res
        End Try

        res.Headers.Add("ContentType", "application/pdf")
        res.Content = New ByteArrayContent(ms.ToArray)
        res.Content.Headers.ContentDisposition = New ContentDispositionHeaderValue("attachment")
        res.Content.Headers.ContentDisposition.FileName = "sectionreport.pdf"
        res.Content.Headers.ContentType = New MediaTypeHeaderValue("application/pdf")

        Return res

    End Function

End Class

Azure Webサイトに発行し,それぞれのレポートに対応するURLにアクセスするとPDFを取得できます。

ページレポート: https://hoge.azurewebsites.net/api/report/pagepdftest
セクションレポート: https://hoge.azurewebsites.net/api/report/sectionpdftest

ちなみに,ベーシックプラン以上だとうまくいきますが,共有プランではエラーが発生します。リモートデバッガーで簡単にエラーを調査できるので.NETを使うのであればAzure Webサイトはとても楽だと思いました。

あと,ActiveReportsをサーバーで運用するにはコア数に応じてコアサーバーライセンスが必要です。クラウドはコア数を簡単に変えられるので,ライセンスに注意ですね。

2013年12月3日火曜日

VS2013でClickOnce > 厳密な名前の署名はこのアセンブリ stdole.dll に対して無効です

PCがリプレイスで新しくなり,Visual Studio も 2010 から 2013 にアップグレードしました。ということで新しいPCには 2010 を入れず,2013 のみをインストールし,プロジェクトも移行しました。
その中でいくつかClickOnceで頒布しているアプリがあるのですが,一部のアプリだけクライアント(Windows7)での起動時に以下のエラーが発生します。

System.Deployment.Application.InvalidDeploymentException (SignatureValidation)
厳密な名前の署名はこのアセンブリ stdole.dll に対して無効です
 問題が発生しているのは,OLEコントロール(ActiveX)を使ったアプリだけのようです。参照を確認して "OLE Automation" の「ローカルにコピーする」を "False" から "True" に変更してClickOnceを発行し直すとうまくいきました。


もしくは一度 "OLE Automation" を参照から削除し, 代わりに"stdole" を追加する方法でもうまくいきました。プロパティは何も変更していません。