3

これは私の最初の StackOverflow 投稿です。前もって感謝します!ここで多くの回答を見つけましたが、現在の問題については Web のどこにも見つかりません。=(

Visual Studio 2010 Express でオンラインで見つけた WCFRestWebService テンプレートを使用してテストおよびデプロイした C# サービスがあります。プロジェクトを Web サーバーに「公開」すると、サービスは期待どおりに機能します。このサービスがオンラインで機能するには、web.config、global.asax、bin/WCFRestWebService1.dll の 3 つのファイルが必要です。

そこで私は、これら 3 つのファイルを生成するプログラムを作成し、これらのファイルを自分の Web サーバーに FTP 送信できないのはなぜだろうかと考えました。だから私はこれを書いた:

namespace Edifice
{
    //code behind for ASP.Net page
    public partial class SiteMaster : System.Web.UI.MasterPage
    { 
        protected void Page_Load(object sender, EventArgs e) { }
        protected void Button1_Click(object sender, EventArgs e) {
            //the first Write() method returns an array of strings 
            //containing .cs files for the project, in this particular 
            //case, 2 strings, one containing the service.cs and one 
            //containing global.asax.cs
            string[] parameters = eConfig.midTier.Write(eConfig);
            string webConfig = eConfig.midTier.WriteWebConfig(eConfig);
            string globalAsax = eConfig.midTier.WriteGlobalAsax(eConfig);
            Assembly assembly = ECompiler.BuildAssembly(eConfig.className, parameters);
            EFTP.Upload(assembly, webConfig, globalAsax, eConfig);
        }
    }
    public static class EFTP
    {
        //for this sample, FTP merely saves the file to the current file system for testing
        public static void Upload(Assembly sourceFile, string webConfig, string globalAsax, EConfiguration eConfig)
        {
            string filepath = "C:\\EdificeTest\\dlls\\";
            using (Stream oStream = new FileStream(filepath + "bin\\" + "WCFRESTService2.dll", FileMode.Create))
            {
                StreamWriter sWriter = new StreamWriter(oStream);
                sWriter.Write(sourceFile);
                sWriter.Close();
            }
            using (Stream oStream = new FileStream(filepath + "Web.config", FileMode.Create))
            {
                StreamWriter sWriter = new StreamWriter(oStream);
                sWriter.Write(webConfig);
                sWriter.Close();
            }
            using (Stream oStream = new FileStream(filepath + "Global.asax", FileMode.Create))
            {
                StreamWriter sWriter = new StreamWriter(oStream);
                sWriter.Write(globalAsax);
                sWriter.Close();
            }
        }
    }
    public static class ECompiler
    {
        public static Assembly BuildAssembly(string assemblyName, string[] sources)
        {
            List<string> WCFRestServiceAssemblies = new List<string>();
            WCFRestServiceAssemblies.Add("Microsoft.CSharp.dll");
            WCFRestServiceAssemblies.Add("System.dll");
            WCFRestServiceAssemblies.Add("System.Configuration.dll");
            WCFRestServiceAssemblies.Add("System.Core.dll");
            WCFRestServiceAssemblies.Add("System.Data.dll");
            WCFRestServiceAssemblies.Add("System.Drawing.dll");
            WCFRestServiceAssemblies.Add("System.EnterpriseServices.dll");
            WCFRestServiceAssemblies.Add("System.Runtime.Serialization.dll");
            WCFRestServiceAssemblies.Add("System.ServiceModel.dll");
            WCFRestServiceAssemblies.Add("System.ServiceModel.Activation.dll");
            WCFRestServiceAssemblies.Add("System.ServiceModel.Web.dll");
            WCFRestServiceAssemblies.Add("System.Web.dll");
            WCFRestServiceAssemblies.Add("System.Web.ApplicationServices.dll");
            WCFRestServiceAssemblies.Add("System.Web.DynamicData.dll");
            WCFRestServiceAssemblies.Add("System.Web.Entity.dll");
            WCFRestServiceAssemblies.Add("System.Web.Extensions.dll");
            WCFRestServiceAssemblies.Add("System.Web.Services.dll");
            WCFRestServiceAssemblies.Add("System.Xml.dll");
            WCFRestServiceAssemblies.Add("System.Xml.Linq.dll");

            Microsoft.CSharp.CSharpCodeProvider provider = new CSharpCodeProvider(new Dictionary<String, String> { { "CompilerVersion", "v4.0" } });
            ICodeCompiler compiler = provider.CreateCompiler();
            CompilerParameters compilerparams = new CompilerParameters(WCFRestServiceAssemblies.ToArray());
            compilerparams.OutputAssembly = assemblyName + ".dll";
            compilerparams.GenerateExecutable = false;
            compilerparams.GenerateInMemory = true;
            CompilerResults results = compiler.CompileAssemblyFromSourceBatch(compilerparams, sources);

            if (results.Errors.HasErrors)
            {
                StringBuilder errors = new StringBuilder("Compiler Errors :\r\n");
                foreach (CompilerError error in results.Errors)
                {
                    errors.AppendFormat("Line {0},{1}\t: {2}\n",
                           error.Line, error.Column, error.ErrorText);
                }
                throw new Exception(errors.ToString());
            }
            else
            {
                return results.CompiledAssembly;
            }
        }
    }
}

したがって、問題は、まったく同じコードを Visual Studio プロジェクトに貼り付けることができ、Visual Studio からそのサービスをコンパイルして発行できる (そして、それが機能する!) にもかかわらず、これらによって生成された同じファイルを使用しようとすると、メソッドを使用すると、サービスを呼び出そうとするとエラーが発生します。

[HttpException]: タイプ 'EdificeTest.Global' を読み込めませんでした。
System.Web.UI.TemplateParser.GetType (文字列 typeName、ブール値の ignoreCase、ブール値の throwOnError) で System.Web.UI.TemplateParser.ProcessInheritsAttribute (文字列 baseTypeName、文字列 codeFileBaseTypeName、文字列 src、アセンブリ アセンブリ) で System.Web.UI. TemplateParser.PostProcessMainDirectiveAttributes(IDictionary parseData)

「EdificeTest」は Web サービスの名前空間であり、Global.asax ファイルによって参照されています。私の分析から、「発行済み」サービスの場合、Global.asax.cs ファイルがコンパイルされてアセンブリに追加され、Global.asax ファイルがアセンブリ内の「分離コード」ファイルを参照しているようです。これは、Visual Studio がプロジェクトのパッケージ化を担当している場合に機能するようですが、Global.asax で 'Inherits=' 属性のタイプが見つからず、エラーがスローされるため、自動展開のステップが欠落している必要があります。 .

助けてください?

4

2 に答える 2

0

にドラッグしてファイリングしdrop your Global.asax.csてくださいApp_Code folder。Global.asax.cs ファイルに関連する退屈な問題をすべて修正します。

乾杯、 ジグネシュ・ジンジャリヤ

于 2013-03-16T05:53:33.283 に答える
0

あなたの問題を完全に理解しているかどうかわかりません。グローバル分離コード クラスをアセンブリに含めたくない場合は、継承/分離コードの代わりに、global.asax でインライン コードを使用できます。

<%@ Application Language="C#" %>
<script RunAt="server">
    protected void Application_Start(object sender, EventArgs e)
    {
    }

    protected void Session_Start(object sender, EventArgs e)
    {

    }

    protected void Application_BeginRequest(object sender, EventArgs e)
    {

    }

    protected void Application_AuthenticateRequest(object sender, EventArgs e)
    {

    }

    protected void Application_Error(object sender, EventArgs e)
    {

    }

    protected void Session_End(object sender, EventArgs e)
    {

    }

    protected void Application_End(object sender, EventArgs e)
    {

    }
</script>
于 2012-08-23T04:29:55.453 に答える