私は、WCF サービスをセットアップしようとしている学生です。ホストとクライアントを servicelibrary で実行しましたが、作成したライブラリ (Gamez) にアクセスするサービスをクライアントが呼び出そうとするまでは問題なく動作します。それが呼び出すメソッドは正常に機能しますが、WCF を介して突然クラッシュします。
それで、これを呼び出すとしましょう:
public int AddValues(int a, int b)
{
int c = a + b;
return c;
}
それはうまくいきますが、これは:
public Guid GetUserId(String userName)
{
Guid user = Gamez.Sql.GetIdFromUserName(userName);
return user;
}
=ブーム。GetIdFromUserName メソッドは、WCF 関連以外のコードから呼び出された場合に正常に機能することに注意してください。
これはクライアント側のコードです:
namespace WCFClient
{
class Program
{
static void Main(string[] args)
{
Service1Client client = new Service1Client();
client.Open();
String gameName = "Liksomspill";
String userName = "Grouse";
//int result = client.GetHighScore(userName, gameName);
//Console.WriteLine("highscoren er: {0}", result);
//Guid result = client.GetUserId(userName);
//Console.WriteLine("blablabla: {0}", result);
int a = 5;
int b = 2;
int result2 = client.AddValues(a, b);
Console.WriteLine("highscoren er {0}", result2);
Console.WriteLine();
Console.ReadLine();
client.Close();
}
}
}
これは、このままである限り正常に機能します (したがって、7 が返されます)。ただし、これらの行からコメントを削除すると、次のようになります。
Guid result = client.GetUserId(userName);
Console.WriteLine("blablabla: {0}", result);
一番上の行は例外をスローしますが、「'Gamez.Sql' の型初期化子が例外をスローしました。これを調べてみましたが、これを修正する方法がよくわかりません (Visual Studio 2012 でコーディングしています)。この件に関して私が見つけたリンクのいくつかを次に示しますが、それは私を非常に混乱させています。
http://social.msdn.microsoft.com/Forums/en-US/wcf/thread/1829b844-1237-4390-8d36-76a7e42a64d3/
私が完全に監視している基本的なものがあると確信しています(... wcfサービスでライブラリを呼び出すことができるはずですよね?または、使用したいライブラリの部分を組み込む必要がありますサービス ライブラリ?)。ライブラリへの参照を追加したので、問題はありません。この質問がちょっとばかげている場合は申し訳ありませんが、この問題に6時間頭を悩ませた後、欲求不満で自分自身を引き裂いています.
背景情報が必要な場合は、基本的に、私が作成している Web サイトにアップロードされたゲーム用の API をセットアップしようとしています (ゲームがデータベースからハイスコアなどを抽出/挿入できるようにするため)。
お時間をいただきありがとうございました。
必要に応じて、ホスト コードを次に示します。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.ServiceModel;
using WcfServiceLibrary;
using System.ServiceModel.Description;
namespace WCFHost
{
class Program
{
static void Main(string[] args)
{
Uri baseAddress = new Uri("http://localhost:8000/WCF");
ServiceHost selfHost = new ServiceHost(typeof(Service1), baseAddress);
ServiceDebugBehavior debug = selfHost.Description.Behaviors.Find<ServiceDebugBehavior>();
if (debug == null)
{
selfHost.Description.Behaviors.Add(
new ServiceDebugBehavior() { IncludeExceptionDetailInFaults = true });
}
else
{
if (!debug.IncludeExceptionDetailInFaults)
{
debug.IncludeExceptionDetailInFaults = true;
}
}
try
{
//selfHost.Open();
selfHost.AddServiceEndpoint(typeof(IService1), new WSHttpBinding(), "Service1Service");
ServiceMetadataBehavior smb = new ServiceMetadataBehavior();
smb.HttpGetEnabled = true;
selfHost.Description.Behaviors.Add(smb);
selfHost.Open();
Console.WriteLine("The service is ready");
Console.WriteLine("Press enter to terminate service");
Console.WriteLine();
Console.ReadLine();
selfHost.Close();
}
catch (CommunicationException ce)
{
Console.WriteLine("An exception occured: {0}", ce.Message);
selfHost.Abort();
}
}
}
}
ServiceLibrary コードは次のとおりです。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.Text;
using Gamez;
namespace WcfServiceLibrary
{
public class Service1 : IService1
{
public string GetData(int value)
{
return string.Format("You entered: {0}", value);
}
public void SetHighScore(int score, String userName)
{
}
public int GetHighScore(String userName, String gameName)
{
int score = Gamez.Sql.getHighScore(userName, gameName);
return score;
}
public Guid GetUserId(String userName)
{
Guid user = Gamez.Sql.GetIdFromUserName(userName);
return user;
}
public CompositeType GetDataUsingDataContract(CompositeType composite)
{
if (composite == null)
{
throw new ArgumentNullException("composite");
}
if (composite.BoolValue)
{
composite.StringValue += "Suffix";
}
return composite;
}
public int AddValues(int a, int b)
{
int c = a + b;
return c;
}
}
}