我是一名试图建立 WCF 服务的学生。我让主机和客户端使用服务库运行,它工作正常,直到我的客户端尝试调用访问我制作的库(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;
}
=繁荣。请记住,从非 WCF 相关代码调用时,GetIdFromUserName 方法可以正常工作。
这是客户端代码:
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);
第一行会引发异常,但我不知道它是什么,因为它只说“FaultException`1 未处理”,并带有潜台词“'Gamez.Sql' 的类型初始化程序引发了异常。”。我试过查找这个,但我真的不明白如何解决这个问题(我在 Visual Studio 2012 中编码)。以下是我在该主题上找到的一些链接,但这让我非常困惑:
http://social.msdn.microsoft.com/Forums/en-US/wcf/thread/1829b844-1237-4390-8d36-76a7e42a64d3/
我确定我完全监督了一些基本的东西(......你应该能够使用 wcf 服务调用库,对吗?或者我是否必须将我想要使用的库的部分合并到服务库?)。我已经添加了对库的引用,所以这应该不是问题。如果这个问题有点愚蠢,我很抱歉,但是在我把头撞到这个问题上六个小时后,我感到沮丧。
如果您需要一些背景信息,我基本上是在尝试为上传到我正在制作的网站的游戏设置一个 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;
}
}
}