私は 3 つの C# プロジェクトがあるプロジェクトに取り組んでいます。1 つのプロジェクトは C# WCF Soap Server、もう 1 つは C# ライブラリ、3 つ目は WPF プロジェクトです。
私が達成しようとしているのは、私の WPF プロジェクトが意図的に例外をスローすることです。これにより、例外の詳細を取得する C# ライブラリ内の関数が呼び出され、データが Soap サーバー プロジェクトにポストされます。Soap サーバー プロジェクトはデータを処理し、統計をデータベースに格納します。
私が抱えている問題は、ライブラリから SOAP メソッドを呼び出すことです。クライアントsvcutil.exe http://localhost:8000/MyProject?wsdl
クラスファイルを正常に作成しました。このファイルを output.config ファイルと共にプロジェクトに追加しましたが、soap メソッドのいずれかが呼び出されると、次のエラー メッセージが表示されます。
Invalid Operation Exception
Could not find default endpoint element that references contract 'CritiMonSoapService.ISoapInterface' in the ServiceModel client configuration section. This might be because no configuration file was found for your application, or because no endpoint element matching this contract could be found in the client element.
私は C# と SOAP を初めて使用するので、これが基本的な質問であるが原因が見つからない場合は申し訳ありません。
ご協力いただきありがとうございます。
更新 以下は石鹸サーバーのコードです
try
{
if (Environment.GetEnvironmentVariable("MONO_STRICT_MS_COMPLIANT") != "yes")
{
Environment.SetEnvironmentVariable("MONO_STRICT_MS_COMPLIANT", "yes");
}
if (String.IsNullOrEmpty(soapServerUrl))
{
string message = "Not starting Soap Server: URL or Port number is not set in config file";
library.logging(methodInfo, message);
library.setAlarm(message, CommonTasks.AlarmStatus.Medium, methodInfo);
return;
}
Console.WriteLine("Soap Server URL: {0}", soapServerUrl);
baseAddress = new Uri(soapServerUrl);
host = new ServiceHost(soapHandlerType, baseAddress);
BasicHttpBinding basicHttpBinding = new BasicHttpBinding();
//basicHttpBinding.Namespace = "http://tempuri.org/";
var meta = new ServiceMetadataBehavior()
{
HttpGetEnabled = true,
HttpGetUrl = new Uri("", UriKind.Relative),
//HttpGetBinding = basicHttpBinding,
};
//meta.MetadataExporter.PolicyVersion = PolicyVersion.Policy15;
host.Description.Behaviors.Add(meta);
host.AddServiceEndpoint(soapManagerInterface, basicHttpBinding, soapServerUrl);
host.AddServiceEndpoint(typeof(IMetadataExchange), MetadataExchangeBindings.CreateMexHttpBinding(), "mex");
var debugBehaviour = new ServiceDebugBehavior()
{
HttpHelpPageEnabled = true,
HttpHelpPageUrl = new Uri("", UriKind.Relative),
IncludeExceptionDetailInFaults = true,
//HttpHelpPageBinding = basicHttpBinding,
};
host.Description.Behaviors.Remove(typeof(ServiceDebugBehavior));
host.Description.Behaviors.Add(debugBehaviour);
host.Opened += new EventHandler(host_Opened);
host.Faulted += new EventHandler(host_Faulted);
host.Closed += new EventHandler(host_Closed);
host.UnknownMessageReceived += new EventHandler<UnknownMessageReceivedEventArgs>(host_UnknownMessageReceived);
host.Open();
}
catch (InvalidOperationException ex)
{
library.logging(methodInfo, string.Format("Invalid Operation Exception: {0}", ex.Message));
}
catch (ArgumentException ex)
{
library.logging(methodInfo, string.Format("Argument Exception: {0}", ex.Message));
}
catch (NotImplementedException ex)
{
library.logging(methodInfo, string.Format("Not implemented: {0}, Inner: {1}", ex.Message, ex.StackTrace));
}
catch (System.ServiceModel.FaultException ex)
{
library.logging(methodInfo, string.Format("Fault Exception: {0}", ex.Message));
}
catch (System.ServiceModel.EndpointNotFoundException ex)
{
library.logging(methodInfo, string.Format("End point not found exception: {0}", ex.Message));
}
catch (System.ServiceModel.ActionNotSupportedException ex)
{
library.logging(methodInfo, string.Format("Action not supported exception: {0}", ex.Message));
}
catch (System.ServiceModel.AddressAccessDeniedException ex)
{
library.logging(methodInfo, string.Format("Address access denied exception: {0}", ex.Message));
}
catch (System.ServiceModel.AddressAlreadyInUseException ex)
{
library.logging(methodInfo, string.Format("Address already in use exception: {0}", ex.Message));
}
catch (System.ServiceModel.CommunicationException ex)
{
library.logging(methodInfo, string.Format("Communication Exception: {0}", ex.Message));
}
catch (Exception ex)
{
library.logging(methodInfo, string.Format("General Exception: {0}", ex.Message));
}
以下は、クライアントクラスファイルの使用方法です
CritiMonSoapService.SoapInterfaceClient client = new CritiMonSoapService.SoapInterfaceClient();
string result = client.checkAppIDExists(appID);
if (result.Equals("200 OK"))
{
CritiMon.isInitialised = true;
CritiMon.appIDValid = true;
Console.WriteLine("CritiMon successfully initialised");
}
else if (result.Contains("App ID does not exist"))
{
Console.ForegroundColor = ConsoleColor.Red;
Console.WriteLine("App ID {0} does not exist. Please login to CritiMon and check your app ID. If you have any issues, then please contact support@boardiesitsolutions.com",
CritiMon.appID);
Console.ResetColor();
}
else if (result.Contains("Failed to check app ID exists"))
{
Console.ForegroundColor = ConsoleColor.Red;
Console.WriteLine("Unable to check your App ID at this time. Please contact support@boardiesitsolutions.com if you continue to see this error");
Console.ResetColor();
}
else if (result.Equals("App ID Not Sent"))
{
Console.ForegroundColor = ConsoleColor.Red;
Console.WriteLine("No App ID was passed into CritiMon.Initialise() function. If you believe you are seeing this in error please send us an email to support@boardiesitsolutions.com");
Console.ResetColor();
}
client.Close();
以下は、svcutil.exe アプリケーションから作成される output.config ファイルです。
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<system.serviceModel>
<bindings>
<basicHttpBinding>
<binding name="BasicHttpBinding_ISoapInterface" />
</basicHttpBinding>
</bindings>
<client>
<endpoint address="http://localhost:8000/CritiMon" binding="basicHttpBinding"
bindingConfiguration="BasicHttpBinding_ISoapInterface" contract="ISoapInterface"
name="BasicHttpBinding_ISoapInterface" />
</client>
</system.serviceModel>
</configuration>