在Azure上部署WCF服务,尝试访问数据库时超时

时间:2012-12-28 11:12:50

标签: c# .net wcf unit-testing azure

我有第一个项目“MyProject.Core”,我有EDMX:

回购集团:

class MyProjectRepo : IMyProjects
{
    public int NumberOfUser()
    {
        return new context().User.Count();
    }

    public string HelloWorld()
    {
        return "Hello World!";
    }
}

界面:

public interface IMyProjects
{
    int NumberOfUser();
    string HelloWorld();
}

工厂:

public static class MyProjectFactory
{
    private static IMyProjects _returnedObject;

    public static IMyProjects GetObject()
    {
        lock (typeof(MyProjectFactory))
        {
            _returnedObject = new MyProjectRepo();
        }
        return _returnedObject;
    }
}

测试项目“”MyProject.Core.Tests“(测试通过):

[Test]
public void NumberOfUser_Test()
{
    var number = MyProjectFactory.GetObject().NumberOfUser();
    Assert.AreEqual(1, number);
}

[Test]
public void HelloWorld_Test()
{
    var hello = MyProjectFactory.GetObject().HelloWorld();
    Assert.AreEqual("Hello World!", hello);
}

我创建了一个“云”项目和一个WCFServiceWebRole。

在WCFServiceWebRole中,我有这个:

public class Service1 : IService1
{
    public int NumberOfUser()
    {
        return MyProjectFactory.GetObject().NumberOfUser();
    }

    public string Hello()
    {
        return MyProjectFactory.GetObject().HelloWorld(); 
    }
}

[ServiceContract]
public interface IService1
{
    [OperationContract]
    int NumberOfUser(string login, string password);

    [OperationContract]
    string Hello();
}

测试WCF的项目,方法“Hello”返回正确的值。 这是我遇到的另一种方法问题。在app.config中,我有这个 :

<bindings>
    <basicHttpBinding>
        <binding name="BasicHttpBinding_IService1" />
    </basicHttpBinding>
</bindings>

<client>
    <endpoint address="http://myproject.azurewebsites.net/Service1.svc"
        binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_IService1"
        contract="myprojectServiceAzure.IService1" name="BasicHttpBinding_IService1" />
</client>

                                   

错误:

  

System.TimeoutException:请求通道在00:00:59.7138476之后等待回复时超时。增加传递的超时值   调用Request或增加SendTimeout值   捆绑。         分配给此操作的时间可能是较长超时的一部分。         ----&GT; System.TimeoutException:对'http://MyProject.azurewebsites.net/Service1.svc'的HTTP请求已超出   分配超时00:00:59.9270000。分配给此的时间   操作可能是一部分         更长的超时。         ----&GT; System.Net.WebException:操作已超时         MyProject.Azure.Tests \ Service References \ MyProjectServiceAzure \ Reference.cs(487,0):   MyProject.Azure.Tests.PointageServiceAzure.Service1Client.MyMethod(字符串   登录,字符串密码)         MyProject.Azure.Tests \ AzureTests.cs(18,0):MyProject.Azure.Tests.AzureTests.Test()

3 个答案:

答案 0 :(得分:0)

您是否检查过Azure防火墙规则?您需要“允许”WCF服务访问SQL Azure数据库。从内存中,您需要检查一个复选框,这允许托管应用程序访问数据库,因为默认情况下不会检查它。

答案 1 :(得分:0)

您是否尝试在web.config中设置MaxReceivedMessageSize等?

请参阅Here

答案 2 :(得分:0)

这不是你问题的答案。这是您面临的真正问题的解决方案:)

你并不是在编写单元测试,而是在进行集成测试。

你必须问问自己,你真正想要测试什么。据我所知,您正在测试与WCF服务的连接,而这不是为单元测试设计的。

我的建议是分离关注点。 WCF是唯一允许远程通信的代理。因此,它不是核心业务逻辑的一部分。您的业​​务逻辑应尽可能纯粹。没有不必要的依赖,可能很难摆脱。如果你必须用载体鸽子(;)替换WCF,逻辑不知道WCF你根本不需要触摸逻辑代码。

以下是我的想法的一个例子:

interface IService //pure business logic, no knowledge of WCF
{
    double Add(double a, double b);
}

class NonWcfService : IService //pure business logic
{
    public double Add(double a, double b)
    {
        return a + b;
    }
}

[ServiceContract]
interface IServiceContract //wcf-bound (because of the attributes)
{
    [OperationContract]
    double Add(double a, double b);
}

class WcfService : IServiceContract //wcf-bound delegates calls to pure business logic
{
    IService sourceService;

    public WcfService(IService sourceService)
    {
        this.sourceService = sourceService; 
    }

    public double Add(double a, double b)
    {
        return sourceService.Add(a,b);
    }
}

现在,您可以编写NonWcfService的单元测试,而无需连接到任何服务。这意味着您的单元测试运行得更快。

您也可以为WcfService编写单元测试,以检查此包装器是否作为代理表现良好。