最新评论
Re:C# 3.0 之新特性总结 54JJ 2011-08-23 14:09
写的太好了,转载了,谢谢无私分享。
你好。不支持泛型类如何处理。运行Reg.bat如下提示:
Microsoft (R) .NET Global Assembly Cache Utility. Version 3.5.30729.1
版权所有(C) Microsoft Corporation。保留所有权利。
程序集已成功添加到缓存中
Microsoft(R) .NET Framework 程序集注册实用工具 2.0.50727.3053
版权所有(C) Microsoft Corporation 1998-2004。保留所有权利。
成功注册了类型
类型库导出程序在处理“Service1Client, Client”时发出警告。警告: 类型库导出程序遇
到从泛型类派生并且未标记为 [ClassInterface(ClassInterfaceType.None)] 的类型。无
法公开这种类型的类接口。请考虑用 [ClassInterface(ClassInterfaceType.None)] 标记
该类型,并使用 ComDefaultInterface 属性向 COM 公开某个显式接口作为默认接口。
成功注册了导出到“D:\WCFServiceMonikerSolution\Client\Reg\Client.tlb”的程序集和
类型库
请按任意键继续. . .
Re:删除表中重复记录 阿宝QQ 2011-03-14 11:33
但是考虑到ntxt不适合distinct
@懒蜜蜂
要是mex方法可以调节MaxArrayLength的大小就好了。特来请教。
@beargo
类似的问题,vba获取的数据有长度限制,报错:
读取xml数据时,超出最大数组长度配额(16384),通过更改在创建xml读取器时所使用的xmlDictionaryReaderQuotas对象的MaxArrayLength属性,可增加此配额
@楚竹荷叶
这问题我刚好解决了.以下是我测试的设置.您可参考一下.
<!--
WCF服务节点设置
-->
<system.serviceModel>
<bindings>
<wsHttpBinding>
<binding name="WCFServiceMoniker.IService" maxBufferPoolSize="12000000" maxReceivedMessageSize="12000000" useDefaultWebProxy="false">
<readerQuotas maxStringContentLength="12000000" maxArrayLength="12000000"/>
<security mode="None"/>
</binding>
</wsHttpBinding>
</bindings>
<services>
<service behaviorConfiguration="WCFServiceMoniker.Service1Behavior" name="WCFServiceMoniker.Service">
<endpoint address="" binding="wsHttpBinding" bindingConfiguration="WCFServiceMoniker.IService" contract="WCFServiceMoniker.IService">
<identity>
<dns value="localhost"/>
<!--<userPrincipalName value="WXWINTER\Administrator" />-->
</identity>
</endpoint>
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior name="WCFServiceMoniker.Service1Behavior">
<serviceMetadata httpGetEnabled="true"/>
<serviceDebug includeExceptionDetailInFaults="false"/>
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>
1'---------------------------------------------------------------
2' MEX service moniker example
3'---------------------------------------------------------------
4' Create a string for the service moniker specifying the address
5' to retrieve the service metadata from
6mexMonikerString = "service:mexAddress='http://localhost/WCFServiceMoniker/Service1.svc/mex'"
7mexMonikerString = mexMonikerString + ", address='http://localhost/WCFServiceMoniker/Service1.svc'"
8mexMonikerString = mexMonikerString + ",binding=WSHttpBinding_IService1, bindingNamespace='http://tempuri.org/'"
9mexMonikerString = mexMonikerString + ", contract=IService1, contractNamespace='http://tempuri.org/'"
10' Create the service moniker object
11Set mexServiceMoniker = GetObject(mexMonikerString)
12' Call the service operations using the moniker object
13WScript.Echo mexServiceMoniker.SayHello("I am LazyBee, My blog is http://lazybee.cnblogs.com/ ")
14Set mexServiceMoniker = nothing
在这上面如何加上设置MaxReceivedMessageSize 等参数的呢?现在在VBA调用碰到了前面提过的默认返回的消息大小为65536,超出这个大小就报错.
这个可能和你的office的安全性配置有关系吧,我当时使用的是office2003没什么限制,所以您可以去了解一下office这方面的信息。
你好,我照你的方法用mex契约,做了服务端。当wcf部署在本机,
然后在excel里面可以得到数据。
但是当wcf部署到远程的时候,excel报错,“无法满足对安全令牌的请求 因为身份验证失败” 请问这是什么原因。非常感谢。
远程的时候浏览 http://192.168.189.20/Service.svc 也是可以看到网页的。可就是excel报错。本机的ip是192.168.187.25
远程的时候浏览 http://192.168.189.20/Service.svc 也是可以看到网页的。可就是excel报错。
你好,我照你的方法用mex契约,做了服务端。当wcf部署在本机,
然后在excel里面可以得到数据。
但是当wcf部署到远程的时候,excel报错,“无法满足对安全令牌的请求 因为身份验证失败” 请问这是什么原因。非常感谢。
这个很有趣,原来是在MSDN杂志上看到的,没想到园子已经有牛人在学了。
哦!原来如此!谢谢了
确实没写过多线程的,最多1主线程+1子线程,也不需要加锁~呵呵
@Marco
刚才仔细看了一下你的代码,我估计你可能没有写过多线程的程序。
你所提到的是并行for中的结果不对吧,这是正常的,而且你的这段代码在不同的机器上会得出不同的结果。这主要是因为其中的result造成的。当多个任务同时执行时,同时要访问result时这时会出现什么结果呢?假设当前result=100,我们是一个双核的计算机,通常情况下并行会拆分成两个任务,任务一和任务二都访问result,这时result=100,任务一执行result=result+5*6,同时任务二执行result=result+10*8,你说最后结果能对吗?如果你想看到正确的结果,在test2方法中对result += i * j语句加锁(目前我们不考虑效率问题),结果就正确了。
不知道啊,你可以执行以下我的代码,两次的计算结果在循环数不同的情况下,正确度也不同,如果外循环和内循环都是10的话,都是2025正确,然后随着循环数的加大,误差会越来越大!见鬼了。这样讨论好麻烦……有别的联系方式吗?~~呵呵
但是也不应该计算错误啊……如果这样,即使是大任务……谁敢用啊
那这样并行计算不是还不如普通的运算了吗?先不说速度,就正确性而言,完全错误啊——如果存在共享变量…………
@Marco
有这个可能,主要是Test2对任务拆分之后,需要对上下文的处理,加上本来上面的运算时间也不长,所以可能看到你说的结果
终于看到MS的并行类库了,不过在测试中发现一个问题,貌似并行的速度还没普通的FOR快,而且结果和FOR完全不同,不知道是我代码的问题还是其他什么问题?源代码如下,希望能给我解答一下,谢谢
using System;
using System.Collections.Generic;
using System.Text;
using System.Threading;
namespace bingxing
{
class Program
{
static private long result = 0;
static void Main(string[] args)
{
Test1();
Console.WriteLine("Test1方法执行结果:"+result.ToString());
Test2();
Console.WriteLine("Test2方法执行结果:" + result.ToString());
Console.ReadLine();
}
static private bool Test1()
{
result = 0;
for (int i = 0; i < 10000; i++)
{
for (int j = 0; j < 10000; j++)
{
result += i * j;
}
}
return true;
}
static private bool Test2()
{
result = 0;
Parallel.For(0, 10000, i =>
{
for (int j = 0; j < 10000; j++)
{
result += i * j;
}
});
return true;
}
}
}
@懒蜜蜂
多谢!
visulStudio2010是提供了支持Parallel的平台,
请问ParallelExtension支持目前在2008里的C++控制台应用程序么?
@LiYan
这个我没有测试过
是
差不多,具体哪些命名空间请参见它的帮助文档
博主,您好,请教一下:
Parallel Extension 支持visual studio2005么?
还有一个问题:
将System.Threading.dll添加到应用库中(Visual Studio’s “Add References" dialog box) 是在哪里操作的呢?
能否指点以下?
在程序头文件重是添加
using namespace System.Threading;
using namespace System.Threading.Collections;
么?
re: 删除表中重复记录 cebio 2009-04-24 16:30
在SQL SERVER 2005下可以采用CTE和ROW_NUMBER函数实现,限制比较少,不要求表中有标识符,可以根据任意属性标识重复数据。
WITH lstHeaderencounter_CTE AS
(
SELECT *,
ROW_NUMBER() OVER(PARTITION BY lListHeader_id, lEncounter_id ORDER BY lListHeader_id) AS rn
FROM lstHeaderencounter
)
DELETE FROM lstHeaderencounter_CTE WHERE rn > 1;
@WCF研究员
目前我们公司还没有这方面的需求,等有了的话会考虑推荐你的:)
最近,我一直在研究WCF,而且自认为做还不错,
只是现在不明白,现在有这方面的工作需求吗
如果有可以给小弟推荐一个,谢谢!
re: 通过PMP了 懒蜜蜂 2009-02-23 09:39
@bbf
谢谢,也预祝你考试一次通过:)
re: 通过PMP了 bbf 2009-02-22 20:00
恭喜!
我下个月28号参加考试.
看到你真诚的回应非常感谢,虽然还没有来得及测试,先谢谢!!
shangwg@sina.com
@drink
谢谢!
如果是MEX和WSDL契约的话,是不需要生成generatedClient这一步的,COM(VB/VBA/Script)利用服务标记调用WCF服务之二使用MEX契约文中有详细的步骤--http://www.cnblogs.com/LazyBee/archive/2008/07/25/1251116.html以供参考。
感谢LazyBee给出这么容易学习的好文章。
不过我很菜鸟,问个小白问题,使用MEX契约的话,是不是只要create一个service就行了?还是要做到生成generatedClient这一步?
re: 通过PMP了 懒蜜蜂 2009-02-20 16:25
@海风1998
谢谢!!
re: 通过PMP了 海风1998 2009-02-20 16:18
恭喜,恭喜,付出总有回报.
re: 通过PMP了 懒蜜蜂 2009-02-20 14:25
@2846
???
re: 通过PMP了 2846 2009-02-20 14:21
垃圾处理
--引用--------------------------------------------------
友人: 谢谢你的提示,仍然有问题,text.mdb.config,text.xls.config,app.config都不行。手头没有vb6,没法试了。
--------------------------------------------------------
在我今天试了一段时间之后,发现了解决方案,请参看COM(VB/VBA/Script)利用服务标记调用WCF服务之四:使用配置文件
http://www.cnblogs.com/LazyBee/archive/2009/02/19/1394235.html
谢谢你的提示,仍然有问题,text.mdb.config,text.xls.config,app.config都不行。手头没有vb6,没法试了。
感谢回复!!!
先说代码不起作用的事,(个generatedClient.cs这个文件每次都会在编译的时候自动再生成一次)这一点不会不知道的。生成选项中的命令行早删除了。
8388608的http响应大小也决不是测试情况下会遇到的。
((System.ServiceModel.WSHttpBinding)Endpoint.Binding).MaxReceivedMessageSize = 8388608; 这行代码在非com情况下调试时是起作用的。但签名发布成com后,确实不起作用。为了验证这种情况,我曾经修改了一个方法,返回和服务相反的内容,但仍然不起作用。
强烈怀疑,在com情况下,只有接口定义被windows读取了,其余的实际代码全部忽略了。所以才会发生不起作用的情况。
再说配置文件,主要是想在wcf服务已经存在的情况下,简单地用代理解决office调用wcf,但是:自己写一个读配置文件的类,我理解必须要代码能起作用,也就是如果代码能起作用,我可以在初始化时解决所用问题,遗憾的是代码不起作用,写了类也不会运行,不麻烦的话,可以自己试一下。
这是我没有料到的矛盾,至于wcf返回值因为是已经完成的,不可能再修改为返回字符类型。毕竟不能影响现有其他类型的客户端啊。
我现在能想到的,可能要包装serviceHost类,再发布成com,只是太麻烦了,所有方法都要包装一遍,而且有变动都要再写一遍。
希望还有简单的办法解决。
再次感谢!
--引用--------------------------------------------------
友人: 补充:希望大家共同探讨
我曾经尝试修改generatedClient.cs:
protected override IDataManager CreateChannel()
{
((System.ServiceModel.WSHttpBinding)Endpoint.Binding).MaxReceivedMessageSize = 8388608;
return base.CreateChannel();
}
public DataManagerClient()
{
((System.ServiceModel.WSHttpBinding)Endpoint.Binding).MaxReceivedMessageSize = 8388608;
}
public DataManagerClient(string endpointConfigurationName) :
base(endpointConfigurationName)
{
((System.ServiceModel.WSHttpBinding)Endpoint.Binding).MaxReceivedMessageSize = 8388608;
}
public DataManagerClient(string endpointConfigurationName, string remoteAddress) :
base(endpointConfigurationName, remoteAddress)
{
((System.ServiceModel.WSHttpBinding)Endpoint.Binding).MaxReceivedMessageSize = 8388608;
}
public DataManagerClient(string endpointConfigurationName, System.ServiceModel.EndpointAddress remoteAddress) :
base(endpointConfigurationName, remoteAddress)
{
((System.ServiceModel.WSHttpBinding)Endpoint.Binding).MaxReceivedMessageSize = 8388608;
}
但一点效果都没有。似乎这些代码根本不起作用?
--------------------------------------------------------
不是不起作用,我估计兄台是使用我这里下载的文件,然后稍微对方法进行了修改,或者增加一些方法来进行测试的吧,如果是这样的话,那就是因为这个generatedClient.cs这个文件每次都会在编译的时候自动再生成一次(主要是因为Build Event中有重新生成的命令),所以兄台的修改不会生效。
--引用--------------------------------------------------
友人: 后来改用网页上的方法一,在客户端安装.net3.5,注册com,再调用,成功,却遇到另一个问题:
wsHttpBing 默认返回的消息大小为65536,超出这个大小就报错!!
WCF客户端是可以用config文件解决,但是做成com 以后该怎么办呢?
GetObject("service:address=XXXX,binding=wsHttpBing,contract=XXXXXXXX")
看上去好像没有用到config文件,如果可以用该怎样设置?如果可以在语句中设,那么GetObject要如何写?
--------------------------------------------------------
wsHttpBing 的消息缺省大小确实是65536,超过就会报错的。关于配置文件的问题,如何使用.net系统自带的,我没有研究过,如果兄台有答案了,可以告诉小弟一声,谢谢!假设不能用系统的配置系统,自己写一个读配置文件的类,也不复杂,应该没有问题。
--引用--------------------------------------------------
友人: 使用MSWord,即VBA调用WCF服务。使用wsHttpBing.
按照仅有的一点提示,用GetObject调用(方法2)。
简单调用是成功了,但是,如果服务端存在复杂类型(类)返回,而不是内建的类型,报错:
MessagePartDescription Name="SayObjectResult" NameSpace="<a href="http://tempuir.org/"的实例无法用于此上下文" target="_new" rel="nofollow">http://tempuir.org/"的实例无法用于此上下文</a>:为设置所需的"Type"属性。
可是WCF仅定义简单类型的返回值肯定没法用了。不知道是不是GetObject()里面的字符串有什么讲究???
--------------------------------------------------------
我也遇到过兄台同样的问题,不过在网上搜索之后没有找到解决方案。我估计也没有解决方案,因为虽然客户端可以通过wsdl来知道元数据信息,但是由于客户端没有.net存在所以不能soap信息转换回对应的类型,故不支持自定义类型和复杂类型(这是我的猜测,关于这个问题没有官方信息)。不过,如果兄台确实想用此种方法,可以将结果返回字符串xml,json编码都可以,然后在客户端代码中做相应的处理即可。GebObject中没有什么特殊之处。
补充:希望大家共同探讨
我曾经尝试修改generatedClient.cs:
protected override IDataManager CreateChannel()
{
((System.ServiceModel.WSHttpBinding)Endpoint.Binding).MaxReceivedMessageSize = 8388608;
return base.CreateChannel();
}
public DataManagerClient()
{
((System.ServiceModel.WSHttpBinding)Endpoint.Binding).MaxReceivedMessageSize = 8388608;
}
public DataManagerClient(string endpointConfigurationName) :
base(endpointConfigurationName)
{
((System.ServiceModel.WSHttpBinding)Endpoint.Binding).MaxReceivedMessageSize = 8388608;
}
public DataManagerClient(string endpointConfigurationName, string remoteAddress) :
base(endpointConfigurationName, remoteAddress)
{
((System.ServiceModel.WSHttpBinding)Endpoint.Binding).MaxReceivedMessageSize = 8388608;
}
public DataManagerClient(string endpointConfigurationName, System.ServiceModel.EndpointAddress remoteAddress) :
base(endpointConfigurationName, remoteAddress)
{
((System.ServiceModel.WSHttpBinding)Endpoint.Binding).MaxReceivedMessageSize = 8388608;
}
但一点效果都没有。似乎这些代码根本不起作用?
使用MSWord,即VBA调用WCF服务。使用wsHttpBing.
按照仅有的一点提示,用GetObject调用(方法2)。
简单调用是成功了,但是,如果服务端存在复杂类型(类)返回,而不是内建的类型,报错:
MessagePartDescription Name="SayObjectResult" NameSpace="
http://tempuir.org/"的实例无法用于此上下文:为设置所需的"Type"属性。
可是WCF仅定义简单类型的返回值肯定没法用了。不知道是不是GetObject()里面的字符串有什么讲究???
后来改用网页上的方法一,在客户端安装.net3.5,注册com,再调用,成功,却遇到另一个问题:
wsHttpBing 默认返回的消息大小为65536,超出这个大小就报错!!
WCF客户端是可以用config文件解决,但是做成com 以后该怎么办呢?
GetObject("service:address=XXXX,binding=wsHttpBing,contract=XXXXXXXX")
看上去好像没有用到config文件,如果可以用该怎样设置?如果可以在语句中设,那么GetObject要如何写?
@伯乐族人 -- www.ibole.cn
希望对你有用