これは私の最初の 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=' 属性のタイプが見つからず、エラーがスローされるため、自動展開のステップが欠落している必要があります。 .
助けてください?