我正在尝试编写一些代码来帮助单元测试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,我也无法 …
我有一个奇怪的问题,我似乎无法诊断,它似乎是一个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上尝试过多种旧服务和新服务的组合,结果是:
configuration.svcinfo和configuration91.svcinfo文件没有列出任何行为,绑定或端点.其余的文件看起来很好.svcutil获取元数据并使用新版本的服务生成代理代码.我查看了新服务中的服务,行为和端点定义,它们与旧服务匹配.我在网上找不到任何引用这样的错误.我意识到我必须在新代码中做错事,但由于它在WinForms应用程序中运行良好,我无法解释其中的差异.
任何帮助将不胜感激.也许我可以保留一些头发;)
-编辑-
在阅读答案后,我做了一些更多的研究,并尝试了一些其他的东西:
我已经查看了没有安全性的服务的xsd等文件,并且还恢复了它们在具有DataContract属性的顶级枚举方面的方式(没有这些)并且还将安全值恢复为他们使用的成为.在这两种情况下,我都没有看到任何错误,除了文件的名称不同:旧的服务引用使用xsd文件,数字后缀范围为2 - 5,而最新的文件使用1 - 4(不能看出这应该是影响事物,因为svcmap中的指针似乎是正确的).它确实使得难以区分,但我已经详细查看了每个文件,数据似乎正确,只是放在不同的文件中.
安全性恢复到旧值之后的wsdl文件与主机IP和计算机名称相同,如预期的那样.但还是configuration.svcinfo和configuration91.svcinfo没有定义端点,行为或绑定.另外,奇怪的是,在定义的两个数据协定中,一个只有一个New成员:它的数据成员不存在.这是一个数据协定,它引用标记为Serializable但未列出DataContract属性的类.唯一改变的是我在类中添加了一个新的字符串成员.更奇怪的是,xsd文件中有一个正确的数据协定类定义.
我很困惑.
好的......我已经在网上找到了两个可能的解决方案,解决了我无法在.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) 我收到此错误:
'/ cms'应用程序中的服务器错误.
此集合已包含方案http的地址.此集合中每个方案最多只能有一个地址.如果您的服务在IIS所驻留你可以通过设置"system.serviceModel/serviceHostingEnvironment/multipleSiteBindingsEnabled"为真或指定"system.serviceModel/serviceHostingEnvironment/baseAddressPrefixFilters"解决问题.参数名称:item描述:执行当前Web请求期间发生未处理的异常.请查看堆栈跟踪以获取有关错误及其源自代码的位置的更多信息.
例外细节:
Run Code Online (Sandbox Code Playgroud)System.ArgumentException: This collection already contains an address with scheme http. There can be at most one address per scheme在这个集合中.如果您的服务在IIS所驻留你可以通过设置"system.serviceModel/serviceHostingEnvironment/multipleSiteBindingsEnabled"为真或指定"system.serviceModel/serviceHostingEnvironment/baseAddressPrefixFilters"解决问题.参数名称:item
来源错误:
在执行当前Web请求期间生成了未处理的异常.可以使用下面的异常堆栈跟踪来识别有关异常的起源和位置的信息.
堆栈跟踪:
Run Code Online (Sandbox Code Playgroud)[ArgumentException: This collection already contains an address with scheme http. There can be at most one address per scheme in this采集.如果您的服务在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
Run Code Online (Sandbox Code Playgroud)[ServiceActivationException: The service '/cms/service.svc' cannot …
这是两个场景.
我们正在使用xmlhttprequest手动构建的xml soap请求,将其发送到wcf soap服务,获取响应并使用xPath解析数据并填写下拉列表.
我们向休息的wcf服务发送一个json请求,并返回一个json响应,并将值分配给下拉列表
哪种情况更快?我的感觉告诉我#2但我可能错了.
我正在调用 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) 我已经创建了一个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) 我们的服务合同中有4种方法(A,B,C,D); 现在我们必须在客户端向用户1显示A&B方法,向用户2显示C,D方法.
我们如何实现这一目标?
我有一个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 = …
我有一个WCF Web服务.我想从此服务发送电子邮件.有从WCF发送电子邮件的库吗?
我希望该库具有简单的调度程序,例如,每小时发送一次或类似的东西.找不到任何东西.
wcf ×10
c# ×5
.net ×1
arrays ×1
email ×1
generics ×1
javascript ×1
json ×1
mocking ×1
performance ×1
task ×1
wcf-binding ×1
web-services ×1
xpath ×1