标签: wcf

通用约束与继承

我正在尝试编写一些代码来帮助单元测试WCF服务.这些服务通过创建代理实例的facade类访问,然后调用代理方法并返回结果; 对于每种代理方法.我希望能够用创建真实服务或虚假服务的东西替换当前的创建代码.

我无法让它工作.我把它归结为以下内容:

using System.ServiceModel;

namespace ExpressionTrees
{
    public interface IMyContract
    {
        void Method();
    }

    public class MyClient : ClientBase<IMyContract>, IMyContract
    {
        public MyClient()
        {
        }

        public MyClient(string endpointConfigurationName)
            : base(endpointConfigurationName)
        {
        }

        public void Method()
        {
            Channel.Method();
        }
    }

    public class Test
    {
        public TClient MakeClient<TClient>()
            where TClient : ClientBase<IMyContract>, IMyContract, new()
        {
            return new MyClient("config");

            // Error:
            // Cannot convert expression of type 'ExpressionTrees.ServiceClient' to return type 'TClient'
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

为什么即使MyClient该类派生ClientBase<IMyContract>并实现IMyContract,我也无法 …

c# generics wcf mocking

-1
推荐指数
1
解决办法
1764
查看次数

WCF无法生成客户端代理

我有一个奇怪的问题,我似乎无法诊断,它似乎是一个PEBCAC的事情,但我花了很多时间试图解决它.我创建了一个WCF服务,我通过Windows服务托管.这项服务已经工作了一段时间,我有一个Windows窗体和一个Web界面.该服务最初是在XP上开发的,但我最近已迁移到Windows 7.当我迁移时,我发现该服务的Windows安全性阻止我在Windows 7上使用我的WinForms应用程序,但它在XP上工作得很好Windows Server 2008 R2,Windows 7和XP上的服务.为了简化开发过程中的事情,我完全禁用了安全性,我的WinForms应用程序再次在windows7上运行.

然后,我对WCF服务进行了一些其他更改,添加方法,更改数据协定等.唯一的端点更改是禁用wshttp上的安全性.突然,更新Web应用程序的服务引用不再创建客户端代理,但它确实生成了wsdl和xsd文件.我在XP和Win7上尝试过多种旧服务和新服务的组合,结果是:

  1. 更新引用时,旧服务工作正常,无论是在XP还是Win7上运行,以及Web应用程序代码是在XP还是Win7上.
  2. 新服务不会创建代理,无论是在XP还是Win7上运行,以及Web应用程序代码是在XP还是Win7上.我从服务引用更新中得不到任何错误,但是,configuration.svcinfoconfiguration91.svcinfo文件没有列出任何行为,绑定或端点.其余的文件看起来很好.
  3. 我可以使用svcutil获取元数据并使用新版本的服务生成代理代码.
  4. 更新服务引用时,我确实获得了对象资源管理器中显示的数据合同中的两个项目,但只有其中一项是正确的.我没有客户端或其他数据合同对象.
  5. 踢球者是Windows窗体应用程序适用于新服务,包括更新引用和调用服务方法.咦?

我查看了新服务中的服务,行为和端点定义,它们与旧服务匹配.我在网上找不到任何引用这样的错误.我意识到我必须在新代码中做错事,但由于它在WinForms应用程序中运行良好,我无法解释其中的差异.

任何帮助将不胜感激.也许我可以保留一些头发;)

-编辑-

在阅读答案后,我做了一些更多的研究,并尝试了一些其他的东西:

我已经查看了没有安全性的服务的xsd等文件,并且还恢复了它们在具有DataContract属性的顶级枚举方面的方式(没有这些)并且还将安全值恢复为他们使用的成为.在这两种情况下,我都没有看到任何错误,除了文件的名称不同:旧的服务引用使用xsd文件,数字后缀范围为2 - 5,而最新的文件使用1 - 4(不能看出这应该是影响事物,因为svcmap中的指针似乎是正确的).它确实使得难以区分,但我已经详细查看了每个文件,数据似乎正确,只是放在不同的文件中.

安全性恢复到旧值之后的wsdl文件与主机IP和计算机名称相同,如预期的那样.但还是configuration.svcinfoconfiguration91.svcinfo没有定义端点,行为或绑定.另外,奇怪的是,在定义的两个数据协定中,一个只有一个New成员:它的数据成员不存在.这是一个数据协定,它引用标记为Serializable但未列出DataContract属性的类.唯一改变的是我在类中添加了一个新的字符串成员.更奇怪的是,xsd文件中有一个正确的数据协定类定义.

我很困惑.

wcf visual-studio-2008

-1
推荐指数
1
解决办法
4654
查看次数

IEnumerable和WCF - 再次

好的......我已经在网上找到了两个可能的解决方案,解决了我无法在.Net 4.0 WCF服务中返回IEnumerable类型的问题.

见下面的链接.这正是我在执行WCF测试客户端工具并尝试调用方法时所获得的.

https://connect.microsoft.com/wcf/feedback/details/336696/ienumerable-t-serialization-bug

请注意,为了确保我的Web服务没有任何问题,我能够为单个记录返回此对象的类型,而不是IEnumerable.

我尝试过的两种解决方案,如下所示都不适用于我.我犯了同样的错误.这真让我抓狂.我知道问题是什么,遵循规避问题的步骤,但我仍然得到同样的错误.

我该如何解决这个问题?

这是我尝试的第一个解决方案:请注意,我甚至尝试在每个方法的最后一个语句中删除"ToList"和"ToArray",因为它已经隐含了.

接口

[OperationContract]
        IList<Priority> GetPriorities();
Run Code Online (Sandbox Code Playgroud)

方法

public IList<Priority> GetPriorities()
        {
            YeagerTechEntities DbContext = new YeagerTechEntities();

            IList<Priority> priority = DbContext.Priorities.Where(p => p.PriorityID > 0).ToList();

            CloseConnection(DbContext);

            return priority.ToList();
        }
Run Code Online (Sandbox Code Playgroud)

这是我尝试的第二个解决方案:

接口

[OperationContract]
        Priority[] GetPriorities();
Run Code Online (Sandbox Code Playgroud)

方法

public Priority[] GetPriorities()

        {
            YeagerTechEntities DbContext = new YeagerTechEntities();

            Priority[] priority = DbContext.Priorities.Where(p => p.PriorityID > 0).ToArray();

            CloseConnection(DbContext);

            return priority.ToArray();
        }
Run Code Online (Sandbox Code Playgroud)

这是一个List而不是IList仍然无法正常工作.

接口

[OperationContract]
        List<Priority> GetPriorities();
Run Code Online (Sandbox Code Playgroud)

方法

public List<Priority> GetPriorities()
        {
            YeagerTechEntities DbContext = new YeagerTechEntities();

            List<Priority> priority = …
Run Code Online (Sandbox Code Playgroud)

wcf entity-framework-4.1

-1
推荐指数
1
解决办法
3198
查看次数

WCF中的服务器错误

我收到此错误:

'/ cms'应用程序中的服务器错误.

此集合已包含方案http的地址.此集合中每个方案最多只能有一个地址.如果您的服务在IIS所驻留你可以通过设置"system.serviceModel/serviceHostingEnvironment/multipleSiteBindingsEnabled"为真或指定"system.serviceModel/serviceHostingEnvironment/baseAddressPrefixFilters"解决问题.参数名称:item描述:执行当前Web请求期间发生未处理的异常.请查看堆栈跟踪以获取有关错误及其源自代码的位置的更多信息.

例外细节:

System.ArgumentException: This collection already contains an address with scheme http.  There can be at most one address per scheme
Run Code Online (Sandbox Code Playgroud)

在这个集合中.如果您的服务在IIS所驻留你可以通过设置"system.serviceModel/serviceHostingEnvironment/multipleSiteBindingsEnabled"为真或指定"system.serviceModel/serviceHostingEnvironment/baseAddressPrefixFilters"解决问题.参数名称:item

来源错误:

在执行当前Web请求期间生成了未处理的异常.可以使用下面的异常堆栈跟踪来识别有关异常的起源和位置的信息.

堆栈跟踪:

[ArgumentException: This collection already contains an address with scheme http.  There can be at most one address per scheme in this
Run Code Online (Sandbox Code Playgroud)

采集.如果您的服务在IIS所驻留你可以通过设置"system.serviceModel/serviceHostingEnvironment/multipleSiteBindingsEnabled"为真或指定"system.serviceModel/serviceHostingEnvironment/baseAddressPrefixFilters"解决问题.参数名称:item] System.ServiceModel.UriSchemeKeyedCollection.InsertItem(Int32 index,Uri item)+16395359 System.Collections.Generic.SynchronizedCollection`1.Add(T item)+79 System.ServiceModel.UriSchemeKeyedCollection..ctor(Uri []地址)+222 System.ServiceModel.ServiceHost..ctor(类型serviceType,Uri [] baseAddresses)+346 System.ServiceModel.Activation.ServiceHostFactory.CreateServiceHost(类型serviceType,Uri [] baseAddresses)+43 System.ServiceModel.Activation.ServiceHostFactory .CreateServiceHost(String constructorString,Uri [] baseAddresses)+530 System.ServiceModel.HostingManager.CreateService(String normalizedVirtualPath)+1413 System.ServiceModel.HostingManager.ActivateService(String normalizedVirtualPath)+50 System.ServiceModel.HostingManager.EnsureServiceAvailable(String normalizedVirtualPath) 1172

[ServiceActivationException: The service '/cms/service.svc' cannot …
Run Code Online (Sandbox Code Playgroud)

wcf

-1
推荐指数
1
解决办法
2万
查看次数

哪个在JavaScript,JSON或SOAP解析方面更快?

这是两个场景.

  1. 我们正在使用xmlhttprequest手动构建的xml soap请求,将其发送到wcf soap服务,获取响应并使用xPath解析数据并填写下拉列表.

  2. 我们向休息的wcf服务发送一个json请求,并返回一个json响应,并将值分配给下拉列表

哪种情况更快?我的感觉告诉我#2但我可能错了.

javascript wcf xpath json

-1
推荐指数
1
解决办法
510
查看次数

将大(ish)字节数组传递给 WCF 服务失败,所有最大属性都已达到最大值

我正在调用 WCF 服务中的一个方法,并传递一个包含文件内容的 byte[] 类型属性的 DTO。这工作正常,直到文件达到大约 3 MB,此时它会失败。我能找到的所有信息都讨论了将配置属性设置为更大的值,但我已经把所有内容都最大化了。这是来自我的 web ste 配置文件:

<bindings>
  <wsHttpBinding>
    <binding name="dxWsBinding" maxReceivedMessageSize="2147483647" maxBufferPoolSize="2147483647">
      <readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647" maxArrayLength="2147483647" maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647" />
      <security mode="None"  >
        <transport clientCredentialType="None" />
        <message establishSecurityContext="false" />
      </security>
    </binding>
  </wsHttpBinding>
</bindings>

<behaviors>
  <endpointBehaviors>
    <behavior name="UserContextClientBehavior">
      <dataContractSerializer maxItemsInObjectGraph="2147483647"/>
      <UserContextBehaviorExtension />
    </behavior>
  </endpointBehaviors>
</behaviors>
Run Code Online (Sandbox Code Playgroud)

这是来自我的 Web 服务配置文件:

<behaviors>
  <serviceBehaviors>
    <behavior name="DefaultBehavior">
      <serviceMetadata httpGetEnabled="True"/>
      <serviceDebug includeExceptionDetailInFaults="True"/>
    </behavior>
    <behavior name="ErrorLoggerBehavior">
      <serviceMetadata httpGetEnabled="True"/>
      <serviceDebug includeExceptionDetailInFaults="True"/>
      <dataContractSerializer maxItemsInObjectGraph="2147483647"/>
      <ErrorLogger logName="DXWcfErrorLog" />
    </behavior>
  </serviceBehaviors>
</behaviors>

<bindings>
  <wsHttpBinding>
    <binding name="dxWsBinding" maxReceivedMessageSize="2147483647" maxBufferPoolSize="2147483647"> …
Run Code Online (Sandbox Code Playgroud)

arrays wcf

-1
推荐指数
1
解决办法
2920
查看次数

为什么我的WCF服务器这么慢

我已经创建了一个WCF服务器和一个WCF客户端来使用该服务.服务器的目的是添加2个传入的数字,并在返回总和之前等待X毫秒.

客户端创建Y任务并启动它们.每个任务都是服务器添加数字并等待X毫秒的请求.

当x = 0且y = 1000时,完成所有任务平均需要6.2秒.当X = 0且Y = 10000时,平均需要61秒来完成所有任务.

为什么这么慢或者这可能是正常的?

谢谢达莫

客户端C#方法

private void radButtonTaskWithStatus_Click(object sender, EventArgs e)
        {
            try
            {
                var dateTime1 = DateTime.UtcNow;
                radProgressBarStatus.Maximum = int.Parse(radTextBoxFloodRequests.Text);
                radProgressBarStatus.Value1 = 0;

                Random rnd = new Random();


                Task<int>[] tasks = new Task<int>[int.Parse(radTextBoxFloodRequests.Text)];

                for (int i = 0; i < int.Parse(radTextBoxFloodRequests.Text); i++)
                {
                    int x = i;
                    tasks[i] = new Task<int>(() =>
                    {    

                        int FirstRandomNumber = rnd.Next(1, 20);
                        int SecondRandomNumber = rnd.Next(1, 20);


                        int result = TaskRequestWithResult(FirstRandomNumber, SecondRandomNumber, int.Parse(radTextBoxFloodDelay.Text), x); …
Run Code Online (Sandbox Code Playgroud)

c# performance wcf task wcf-binding

-1
推荐指数
1
解决办法
892
查看次数

WCF方法不同用户的可访问性

我们的服务合同中有4种方法(A,B,C,D); 现在我们必须在客户端向用户1显示A&B方法,向用户2显示C,D方法.

我们如何实现这一目标?

c# wcf

-1
推荐指数
1
解决办法
60
查看次数

为什么双值55.68743正在转换为55.6874299999?

我有一个wcf方法,我必须计算纬度经度点之间的距离.距离计算器方法采用double值作为参数.所以当我发送纬度值= 55.68743时,.net将其转换为55.6874299999,我的距离错误.

为什么价值在转换?有谁知道我该怎么解决?

这是一些代码......

public double distance(double lat1, double lon1, double lat2, double lon2)
    {
        double theta = lon1 - lon2;
        double dist = Math.Sin(deg2rad(lat1)) * Math.Sin(deg2rad(lat2)) + Math.Cos(deg2rad(lat1)) * Math.Cos(deg2rad(lat2)) * Math.Cos(deg2rad(theta));
        dist = Math.Acos(dist);
        dist = rad2deg(dist);
        dist = dist * 60 * 1.1515;
        dist = dist * 1.609344;

        return (dist);
    }
    public double deg2rad(double deg)
    {
        return (deg * Math.PI / 180.0);
    }
    public double rad2deg(double rad)
    {
        return (rad / Math.PI * 180.0);
    }
Run Code Online (Sandbox Code Playgroud)

在上面的代码中,我正在计算两点的距离.lat1 = …

.net c# wcf

-2
推荐指数
1
解决办法
255
查看次数

从wcf Web服务发送电子邮件

我有一个WCF Web服务.我想从此服务发送电子邮件.有从WCF发送电子邮件的库吗?
我希望该库具有简单的调度程序,例如,每小时发送一次或类似的东西.找不到任何东西.

c# email wcf web-services

-2
推荐指数
1
解决办法
3334
查看次数