1

我是一名试图建立 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/

http://sergecalderara.wordpress.com/2008/11/25/systemservicemodelfaultexception1-was-unhandled-by-user-code/

我确定我完全监督了一些基本的东西(......你应该能够使用 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;

        }
    }
}
4

0 回答 0