"開発Web" の一覧

@Html.DropDownListで「同一のキーを含む項目が既に追加されています。」

@Html.DropDownListにて「同一のキーを含む項目が既に追加されています。」とのエラー。

勝手に、KeyがユニークならValueは重なっても良いと思い込んでいた。

【エラー発生ケース】
<%= @Html.DropDownList(“select-test”, new SelectList(new Dictionary<string, int> {{” – “, -1 },{“あ”, 1 },{“い”, 13 },{“う”, 14 }, {“え”,15 }, {“お”, 16 }, {““, 17 } }, “Value”, “Key”, intTestValue))%>

 

【正常ケース】
<%= @Html.DropDownList(“select-test”, new SelectList(new Dictionary<string, int> {{” – “, -1 },{“あ”, 1 },{“い”, 13 },{“う”, 14 }, {“え”,15 }, {“お”, 16 }, {““, 17 } }, “Value”, “Key”, intTestValue))%>

‘TestService’ を参照する既定のエンドポイント要素が見つかりませんでした

 

VisualStudio2012にてTestServiceというWebサービスを利用したクラスライブラリをASP.MVCのプロジェクトから照会した際に下記のエラーが実行時に発生。

‘TestService’ を参照する既定のエンドポイント要素が見つかりませんでした

クラスライブラリのapp.configをASP.MVCプロジェクトのWeb.configへコピー。その後、一部調整することで解決した。

クラスライブラリ名のWeb.config側(namespace名)に設定しないとダメな模様。また、Web.configを変更する=ASP.NET開発サーバーの再起動が必要と思われるので注意。

クラスライブラリ(TestLib)のapp.config

<?xml version=”1.0″ encoding=”utf-8″ ?>
<configuration>
    <system.serviceModel>
        <bindings>
            <basicHttpBinding>
                <binding name=”TestUtilSoap” />
            </basicHttpBinding>
        </bindings>
        <client>
            <endpoint address=”http://www.example.com/TestService/TestUtil.asmx”
                binding=”basicHttpBinding” bindingConfiguration=”TestUtilSoap”
                contract=”WsTestUtil.TestUtilSoap” name=”TestUtilSoap” />
        </client>
    </system.serviceModel>
</configuration>

 

ASP.MVCプロジェクトのWeb.config

<system.serviceModel>
    <bindings>
        <basicHttpBinding>
            <binding name=”TestLib.TestUtilSoap” />
        </basicHttpBinding>
    </bindings>
    <client>
        <endpoint address=”http://www.example.com/TestService/TestUtil.asmx”
            binding=”basicHttpBinding” bindingConfiguration=”TestLib.TestUtilSoap”
            contract=”WsTestUtil.TestUtilSoap” name=”TestLib.TestUtilSoap” />
    </client>
</system.serviceModel>

IIS6でmachine.configアクセス拒否

IIS_Error 

構成にエラーがあります。
説明: この要求を処理するために必要な構成ファイルの処理中にエラーが発生しました。以下のエラーの詳細を確認し、構成ファイルに変更を加えてください。
パーサー エラー メッセージ: 構成ファイルの読み込み中にエラーが発生しました。: パス ‘c:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\Config\machine.config’ へのアクセスが拒否されました。
ソース エラー:
[関連したソースの行はありません]
ソース ファイル: c:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\Config\machine.config    行: 0

Windows 2003 Server R2にてIISを設定中に上記のエラーが発生した。

c:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\Config\machine.config

にIIS_WPGユーザーに読み取り権限を与える事で、回避できるようになりました。ディレクトリのアクセス権は確認したけど、ファイルまで確認しなかった為、かなりハマってしまった。単純すぎて情報が無い?

C#にてPDFファイルを結合

複数のPDFファイル一つのファイルにまとめるにはiTextSharpを使う。こちらを参考にさせて頂きました。これによって、結合できるがWebアプリ上でテンポラリファイルを生成とかカッコ悪い。

ということで、MemoryStreamに対応させました。が・・・copy.close時にMemoryStreamが閉じられてしまう。とりあえず、doc.close();とcopy.close();をコメントにしてみると、ファイル上で結合したものと比較して末尾が切れてる。

結局、

copy.CloseStream = false

がポイントでした。

 

        public static void fnJoinPdf(MemoryStream ms1, MemoryStream ms2, MemoryStream msJoin)
        {
            Document doc = null;    // 出力ファイルDocument
            PdfCopy copy = null;    // 出力ファイルPdfCopy
            MemoryStream[] aryMsStream = { ms1, ms2 }; // 入力ファイルを配列化
            try
            {
                //-------------------------------------------------------------------------------------
                // ファイル件数分、ファイル結合
                //-------------------------------------------------------------------------------------
                for (int i = 0; i < aryMsStream.Length; i++)
                {
                    // リーダー取得
                    PdfReader reader = new PdfReader(aryMsStream[i].ToArray());
                    // 入力ファイル1を出力ファイルの雛形にする
                    if (i == 0)
                    {
                        // Document作成
                        doc = new Document(reader.GetPageSizeWithRotation(1));
                        // 出力ファイルPdfCopy作成
                        copy = new PdfCopy(doc, msJoin);
                        copy.CloseStream = false;
                        // 出力ファイルDocumentを開く
                        doc.Open();
                        // 文章プロパティ設定
                        doc.AddKeywords((string)reader.Info["Keywords"]);
                        doc.AddAuthor((string)reader.Info["Author"]);
                        doc.AddTitle((string)reader.Info["Title"]);
                        doc.AddCreator((string)reader.Info["Creator"]);
                        doc.AddSubject((string)reader.Info["Subject"]);
                    }
                    // PDFコンテンツを取得、copyオブジェクトに追加
                    for (int iPageCnt = 1; iPageCnt <= reader.NumberOfPages; iPageCnt++)
                    {
                        PdfImportedPage page = copy.GetImportedPage(reader, iPageCnt);
                        copy.AddPage(page);
                    }
                    // フォーム入力を結合
                    PRAcroForm form = reader.AcroForm;
                    if (form != null)
                        copy.CopyAcroForm(reader);
                    // リーダーを閉じる
                    reader.Close();
                }
            }
            finally
            {
                if (copy != null)
                    copy.Close();
                if (doc != null)
                    doc.Close();
            }
        }

Masterページに対応させる時に気をつける事(ASP.NET3.5)

JavaScript上で扱うIDが自動生成となる為、ID指定部分をサーバー上で生成する必要がある。

test.aspx (変更前)

<A href="Javascript:TestProc(document.forms[0].textBox1.value, ‘AAAA’)" />

test.aspx (変更後)

<A href="#" id="alnk1" runat="server"/>

test.aspx.vb

(フォームロードあたりで)

Me.alnk.HRef = ("Javascript:TestProc(document.forms[0]." & textBox1.ClientID & ".value, ‘AAAA’)"

※String.Formatを使った方が良いです。あくまでサンプルという事で。JavaでOpenしたWindowから制御させるには、Open時にオブジェクト名を渡してスクリプト生成。

FindControlなどの関数は修正が必要。

FindControl("TextBox1") → Master.FindControl("コンテンツID").FindControl("TextBox1")

ASP.NET3.5にて文字化け

秀丸などで、文字のエンコーディングをShift-JISなどからUTF-8へ*.aspxファイルを変更するとそれまで正常に表示できていたページも文字化けする。

原因は、BOMデータが無くなる為。Diffを見ると先頭行で相違が出る。テキストエディタがBOM対応していると違いが判らないのでちょっとハマった。

UTF8Trouble

解決方法は、メモ帳で開いて上書き保存するだけ。

VisualStudio2005と2008

今までWebアプリはVS2003のプロジェクトが多かったので、VS2008は放置していたがVS2005へのコンバートが完了したので、今頃になって調査してみた。

VS2008(.Net Framework 3.5)へアップグレードするとAJAXがFrameworkに内包されるようなので、前向きに検討してみよ。