wcf服务编程
① 推荐一本讲WCF比较好的书籍
wcf编程这书别人的评价挺不错的
也算是基础
不过内容挺多的,看的时间长了有点烦
不过,现在这书出新版本了
名字不教wcf服务编程
叫wcf编程(第二版),建议买第二版
② 初学wcf的一点疑问,求教!
每种契约的实现方式都是不同的,分别支援原来的webservice,.net remoting……那些模式。当你使用BasicHttpBinding时,的确跟.NET Webservice非常像,因为这个契约兼容.NET Webservice
③ 跪求WCF的工作原理
首先:
WCF的全称是,Windows通信基础的意思,是Microsoft为构建面向服务的应用程序而提供的统一编程模型,它整合.NET平台下所有和分布式系统有关的技术。
其次:
WCF本质是面向服务的。主要分为服务端和客户端两部分。服务端和客户端进行通信的过程如下图所示:
在上图中,主机进程就是服务端,在其中需要创建服务,然后将服务通过EndPoint(终结点)与客户端进行通信。客户端在使用服务时,需要首先创建一个代理服务,然后调用这个代理服务。
EndPoint(终结点)在WCF中是非常重要的部分。它包含了服务地址(Address)、绑定格式(Binding)和契约(Contract)。其中,地址定义了服务的位置,绑定定义了服务通信的方式,契约定义了服务所提供的功能。为了便于记忆,我们将终结点的这三个要素简称为服务的ABC。
服务端提供了什么服务,都具备什么功能,这被称为WCF服务的契约。
WCF服务不能凭空存在。每个WCF服务都必须托管(Hosting)在一个Windows进程中,该进程被称为宿主进程。
WCF服务宿主可以由IIS提供,可以由Windows服务提供,也可以由WindowsVista的Windows激活服务提供。其中,使用IIS托管只能使用HTTP协议。
④ 如何创建通过 WebSocket 进行通信的 WCF 服务
WebSocket是HTML5开始提供的一种浏览器与服务器间进行全双工通讯的网络技术。在WebSocket API中,浏览器和服务器只需要做一个握手的动作,然后,浏览器和服务器之间就形成了一条快速通道。两者之间就直接可以数据互相传送。
Cocos2d-x引擎集成libwebsockets,并在libwebsockets的客户端API基础上封装了一层易用的接口,使得引擎在C++, JS, Lua层都能方便的使用WebSocket来进行游戏网络通讯。
引擎支持最新的WebSocket Version 13。
在C++中使用
详细代码可参考引擎目录下的/samples/Cpp/TestCpp/Classes/ExtensionsTest/NetworkTest/WebSocketTest.cpp文件。
头文件中的准备工作
首先需要include WebSocket的头文件。
#include "network/WebSocket.h"
cocos2d::network::WebSocket::Delegate定义了使用WebScocket需要监听的回调通知接口。使用WebSocket的类,需要public继承这个Delegate。
class WebSocketTestLayer : public cocos2d::Layer, public cocos2d::network::WebSocket::Delegate
并Override下面的4个接口:
virtual void onOpen(cocos2d::network::WebSocket* ws);
virtual void onMessage(cocos2d::network::WebSocket* ws, const cocos2d::network::WebSocket::Data& data);
virtual void onClose(cocos2d::network::WebSocket* ws);
virtual void onError(cocos2d::network::WebSocket* ws, const cocos2d::network::WebSocket::ErrorCode& error);
后面我们再详细介绍每个回调接口的含义。
新建WebSocket并初始化
WebSocket.org 提供了一个专门用来测试WebSocket的服务器"ws://echo.websocket.org"。 测试代码以链接这个服务器为例,展示如何在Cocos2d-x中使用WebSocket。
新建一个WebSocket:
cocos2d::network::WebSocket* _wsiSendText = new network::WebSocket();
init第一个参数是delegate,设置为this,第二个参数是服务器地址。 URL中的"ws://"标识是WebSocket协议,加密的WebSocket为"wss://".
_wsiSendText->init(*this, "ws://echo.websocket.org")
WebSocket消息监听
在调用send发送消息之前,先来看下4个消息回调。
onOpen
init会触发WebSocket链接服务器,如果成功,WebSocket就会调用onOpen,告诉调用者,客户端到服务器的通讯链路已经成功建立,可以收发消息了。
void WebSocketTestLayer::onOpen(network::WebSocket* ws)
{
if (ws == _wsiSendText)
{
_sendTextStatus->setString("Send Text WS was opened.");
}
}
onMessage
network::WebSocket::Data对象存储客户端接收到的数据, isBinary属性用来判断数据是二进制还是文本,len说明数据长度,bytes指向数据。
void WebSocketTestLayer::onMessage(network::WebSocket* ws, const network::WebSocket::Data& data)
{
if (!data.isBinary)
{
_sendTextTimes++;
char times[100] = {0};
sprintf(times, "%d", _sendTextTimes);
std::string textStr = std::string("response text msg: ")+data.bytes+", "+times;
log("%s", textStr.c_str());
_sendTextStatus->setString(textStr.c_str());
}
}
onClose
不管是服务器主动还是被动关闭了WebSocket,客户端将收到这个请求后,需要释放WebSocket内存,并养成良好的习惯:置空指针。
void WebSocketTestLayer::onClose(network::WebSocket* ws)
{
if (ws == _wsiSendText)
{
_wsiSendText = NULL;
}
CC_SAFE_DELETE(ws);
}
onError
客户端发送的请求,如果发生错误,就会收到onError消息,游戏针对不同的错误码,做出相应的处理。
void WebSocketTestLayer::onError(network::WebSocket* ws, const network::WebSocket::ErrorCode& error)
{
log("Error was fired, error code: %d", error);
if (ws == _wsiSendText)
{
char buf[100] = {0};
sprintf(buf, "an error was fired, code: %d", error);
_sendTextStatus->setString(buf);
}
}
send消息到服务器
在init之后,我们就可以调用send接口,往服务器发送数据请求。send有文本和二进制两中模式。
发送文本
_wsiSendText->send("Hello WebSocket, I'm a text message.");
发送二进制数据(多了一个len参数)
_wsiSendBinary->send((unsigned char*)buf, sizeof(buf));
主动关闭WebSocket
这是让整个流程变得完整的关键步骤, 当某个WebSocket的通讯不再使用的时候,我们必须手动关闭这个WebSocket与服务器的连接。close会触发onClose消息,而后onClose里面,我们释放内存。
_wsiSendText->close();
在Lua中使用
详细代码可参考引擎目录下的/samples/Lua/TestLua/Resources/luaScript/ExtensionTest/WebProxyTest.lua文件。
创建WebSocket对象
脚本接口相对C++要简单很多,没有头文件,创建WebSocket对象使用下面的一行代码搞定。 参数是服务器地址。
wsSendText = WebSocket:create("ws://echo.websocket.org")
定义并注册消息回调函数
回调函数是普通的Lua function,4个消息回调和c++的用途一致,参考上面的说明。
local function wsSendTextOpen(strData)
sendTextStatus:setString("Send Text WS was opened.")
end
local function wsSendTextMessage(strData)
receiveTextTimes= receiveTextTimes + 1
local strInfo= "response text msg: "..strData..", "..receiveTextTimes
sendTextStatus:setString(strInfo)
end
local function wsSendTextClose(strData)
print("_wsiSendText websocket instance closed.")
sendTextStatus = nil
wsSendText = nil
end
local function wsSendTextError(strData)
print("sendText Error was fired")
end
Lua的消息注册不同于C++的继承 & Override,有单独的接口registerScriptHandler。 registerScriptHandler第一个参数是回调函数名,第二个参数是回调类型。 每一个WebSocket实例都需要绑定一次。
if nil ~= wsSendText then
wsSendText:registerScriptHandler(wsSendTextOpen,cc.WEBSOCKET_OPEN)
wsSendText:registerScriptHandler(wsSendTextMessage,cc.WEBSOCKET_MESSAGE)
wsSendText:registerScriptHandler(wsSendTextClose,cc.WEBSOCKET_CLOSE)
wsSendText:registerScriptHandler(wsSendTextError,cc.WEBSOCKET_ERROR)
end
send消息
Lua中发送不区分文本或二进制模式,均使用下面的接口。
wsSendText:sendString("Hello WebSocket中文, I'm a text message.")
主动关闭WebSocket
当某个WebSocket的通讯不再使用的时候,我们必须手动关闭这个WebSocket与服务器的连接,以释放服务器和客户端的资源。close会触发cc.WEBSOCKET_CLOSE消息。
wsSendText:close()
在JSB中使用
详细代码可参考引擎目录下的/samples/Javascript/Shared/tests/ExtensionsTest/NetworkTest/WebSocketTest.js文件。
创建WebSocket对象
脚本接口相对C++要简单很多,没有头文件,创建WebSocket对象使用下面的一行代码搞定。 参数是服务器地址。
this._wsiSendText = new WebSocket("ws://echo.websocket.org");
设置消息回调函数
JSB中的回调函数是WebSocket实例的属性,使用匿名函数直接赋值给对应属性。可以看出JS语言的特性,让绑定回调函数更加优美。四个回调的含义,参考上面c++的描述。
this._wsiSendText.onopen = function(evt) {
self._sendTextStatus.setString("Send Text WS was opened.");
};
this._wsiSendText.onmessage = function(evt) {
self._sendTextTimes++;
var textStr = "response text msg: "+evt.data+", "+self._sendTextTimes;
cc.log(textStr);
self._sendTextStatus.setString(textStr);
};
this._wsiSendText.onerror = function(evt) {
cc.log("sendText Error was fired");
};
this._wsiSendText.onclose = function(evt) {
cc.log("_wsiSendText websocket instance closed.");
self._wsiSendText = null;
};
send消息
发送文本,无需转换,代码如下:
this._wsiSendText.send("Hello WebSocket中文, I'm a text message.");
发送二进制,测试代码中,使用_stringConvertToArray函数来转换string为二进制数据,模拟二进制的发送。 new Uint16Array创建一个16位无符号整数值的类型化数组,内容将初始化为0。然后,循环读取字符串的每一个字符的Unicode编码,并存入Uint16Array,最终得到一个二进制对象。
_stringConvertToArray:function (strData) {
if (!strData)
returnnull;
var arrData = new Uint16Array(strData.length);
for (var i = 0; i < strData.length; i++) {
arrData[i] = strData.charCodeAt(i);
}
return arrData;
},
send二进制接口和send文本没有区别,区别在于传入的对象,JS内部自己知道对象是文本还是二进制数据,然后做不同的处理。
var buf = "Hello WebSocket中文,\0 I'm\0 a\0 binary\0 message\0.";
var binary = this._stringConvertToArray(buf);
this._wsiSendBinary.send(binary.buffer);
主动关闭WebSocket
当某个WebSocket的通讯不再使用的时候,我们必须手动关闭这个WebSocket与服务器的连接,以释放服务器和客户端的资源。close会触发onclose消息。
onExit: function() {
if (this._wsiSendText)
this._wsiSendText.close();
⑤ WCF是什么如何学习
Windows Communication Foundation (WCF)是一个面向服务编程的综合分层架构。该架构的顶层称为服务模型层(Service Model Layer),使用户用最少的时间和经历建立自己的软件产品和外界通信的模型。它使得开发者能够建立一个跨平台的安全、可信赖、事务性的解决方案,且能与已有系统兼容协作。 开发WCF服务的端点需要涉及下面几个任务:开发服务契约:指定端点可用的WCF服务的操作。开发绑定:绑定指点端点与外界通信的协议。添加,删除,更新和配置端点:在配置文件中添加和绑定端点(当然也可以用编码的形式,但是不推荐。)添加行为:一个行为就是一个组件,能增强服务,端点,和操作的运行时行为。
⑥ 《wcf服务编程》适合初学者吗,如果不适合请推荐本好的入门书籍。
不适合,这本书全是废话。
建议直接通过网上的资料学习WCF。
WCF其实很简单,但是如果您是初学者,请先尝试使用WebService。
直接使用Visual Studio创建WebService,然后在另一个项目中添加服务引用(在引用处点击右键)。
当您能够正确的完成WebService传递数据或调用方法时,请用同样的方法尝试创建WCF服务和调用。
当以上尝试都能够正确运行时:
请研究“WCF契约模式”,然后研究WCF配置文件。
⑦ c++如何调用wcf 新手
C++调用WCF
写的ServiceContract
一共有几种方式?
C++调用WCF
写的ServiceContract
一共有几种方式?我下面的调用方式虽然能访问但是不理想。
在创建C++工程时候选择
公共语言运行库支持(/clr)
可以添加WEB引用。
并且成功创建代理类。
也可以调用WCF提供的OperationContract具体方法。
但是有一个问题,由于以上操作选择了
公共语言运行库支持(/clr)
,这样会不会要求C++客户端程序强制安装.net
freamwork的托管运行环境。从而增加客户端的安装复杂性。
如果要求安装.net
freamwork的托管运行环境,那么有什么好的方法可以不选择
公共语言运行库支持(/clr)
。或者不安装.net
freamwork的托管运行环境,也可以使用WCF提供的
ServiceContract。
也就是C++调用WCF
写的ServiceContract
一共有几种方式?
小弟刚研究WCF不长时间,但是有WEBSERVICE基础(WEBSERVICE的安全也不会做),多谢各位前辈。
-----------------
大家有以下几种吧,
1.直接调用,把WCF服务暴露为Web服务,如果C++可以直接调用Web服务,那么也可以直接调WCF服务。
2.把WCF服务暴露为Rest
服务,C++如果可以调用普通的网页,通过Http标准操作,Get,Put,post等那么它也可以直接调用Rest
WCF服务。
3.另外就是把调用WCF服务的客户端包装成程序集,然后C++代码调用程序集里的C#代码。
前两种方式应该操作性更强吧。
⑧ C++怎么调用WCF
C++调用WCF 写的ServiceContract 一共有几种方式?C++调用WCF 写的ServiceContract 一共有几种方式?我下面的调用方式虽然能访问但是不理想。在创建C++工程时候选择 公共语言运行库支持(/clr) 可以添加WEB引用。 并且成功创建代理类。 也可以调用WCF提供的OperationContract具体方法。 但是有一个问题,由于以上操作选择了 公共语言运行库支持(/clr) ,这样会不会要求C++客户端程序强制安装.net freamwork的托管运行环境。从而增加客户端的安装复杂性。 如果要求安装.net freamwork的托管运行环境,那么有什么好的方法可以不选择 公共语言运行库支持(/clr) 。或者不安装.net freamwork的托管运行环境,也可以使用WCF提供的 ServiceContract。也就是C++调用WCF 写的ServiceContract 一共有几种方式?小弟刚研究WCF不长时间,但是有WEBSERVICE基础(WEBSERVICE的安全也不会做),多谢各位前辈。-----------------大家有以下几种吧,1.直接调用,把WCF服务暴露为Web服务,如果C++可以直接调用Web服务,那么也可以直接调WCF服务。2.把WCF服务暴露为Rest 服务,C++如果可以调用普通的网页,通过Http标准操作,Get,Put,post等那么它也可以直接调用Rest WCF服务。3.另外就是把调用WCF服务的客户端包装成程序集,然后C++代码调用程序集里的C#代码。前两种方式应该操作性更强吧。
⑨ WCF服务编程一书中写到:契约操作不能使用引用对象参数,只允许使用基本类型或者数据契约
在过程调用中传递了一个无效参数。这可能是由于参数超出范围,或包含无效数据。另外,有可能在不适当的时间对过程进行了调用。要纠正该错误验证传递给过程的参数是有效的。验证在适当的时间调用函数。溢出试图赋给变量的赋值太大,这是因为:赋值,计算或者数据类型转换结果很大以至于不能代表此种类型变量值的范围。属性赋值超出了属性所能接受的最大值。整数类型数字的计算结果大于一个整数。要纠正该错误将值赋给一个较大取值范围的变量类型。确保赋值符合属性范围。内存不足分配与该计算机有效内存一样多的内存。这可能是一个动态分配数组增长得太大,或者是对象实例数目过多。要纠正该错误使用Erase语句来重新分配动态数组的储存空间。使用ReDim语句来重新分配储存空间。关闭任何已经打开、不必需的应用程序,文件或者源文件。下标越界要访问的数组中元素数目比期望的少。例如试图从一个定义为10个元素的数组中访问到11个元素。.要纠正该错误确保你的代码中包含检察元素是否越界的边界。重新定义一个更大的数组大小至需要的维数。该数组为定长的或者临时被锁定试图用ReDim函数来改变一个定长数组的元素数目。动态数组或者Variant变量内的数组可以被暂时的锁定。要纠正该错误如果在过程内部定义数组,用ReDim函数将其从静态变为动态。如果在模块水平上说明数组,不要指定数组中元素的数目。被零除创建一个试图将数字被零除的表达式。被零除得到无穷大(不可用)结果。要纠正该错误检查表达式的输入或大小写错误。类型不匹配试图比较不相容数据类型的值。例如,比较一个字符串和一个数值。要纠正该错误当进行比较时,要确保数据类型相同。用一个的数据类型来计算另一个的值,然后重新比较。字符串空间溢出试图创建字符串对象时系统内存被用尽。这可能是因为动态分配数组越来越大或对象实例的数目过大。要纠正该错误使用Erase语句来重新分配动态数组的储存空间。使用ReDim语句来重新分配储存空间。关闭任何已经打开、不必需的应用程序,文件或者源文件无法执行请求的操作当主机使脚本引擎中断时无法继续执行脚本。主机未指定明确的返回错误代码。要纠正该错误该错误的解决与主机有关。堆栈溢出过程嵌套太深。每次代码从一个过程跳到另一个过程,本地变量的内容被放到堆栈中。堆栈是一个大小随着要求执行的脚本动态增长和缩小的内存工作区域。要纠正该错误检查没有嵌套很深的过程。确保递归(重入)过程没有经常的调用自身。确保递归过程被正常终止。未定义Sub或Function试图调用一个不存在的过程。要纠正该错误检查过程的拼写确保输入正确。加载DLL错误应用程序引用了一个无法找到的DLL,一个DLL可能引用了另一个无法找到的DLL。要纠正该错误确保DLL存在。使用全路径名引用DLL。获得被引用的DLL并使其对其他DLL有效。内部错误发生内部错误。要纠正该错误除非这是由Raise方法产生,请与微软产品服务联系报告出现错误消息的情况。未设置对象变量试图使用无效对象的对象属性。如果遗漏了Set语句,将在对象引用产生错误。要纠正该错误为对象变量指定一个引用。For循环未初始化在脚本中执行跳到ForNext循环中间的结果。由于ForNext循环计数必须被初始化所以产生错误。下面演示了一个ForNext循环的正确结构。Forcounter=startToend[Stepstep][statements][ExitFor][statements]Next要纠正该错误移去跳转至ForNext循环的语句。确保ForNext循环包含了所有必须的部分。非法使用Null试图获得一个为Null的Variant变量的值。你只能获得包含有效值的Variant变量的值。Null是一个Variant一个用来指示一个数据项不包含任何有效数据的子类型。要纠正该错误确保变量包含有效数据。需要对象提供的对象无效(或无法认为是一个对象)。对属性和方法的引用需要一个显式的对象限定符。要纠正该错误提供一个对象限定符。检查对象限定符的拼写。ActiveX部件无法创建对象由于对象类未在系统注册表中注册或者是一个或多个相关的动态链接库无效(DLLs),VB5.5运行时无法初始化对象。另外一种可能情况是,由于未找到或是已经损坏,对象所需的DLL不可用。要纠正该错误确保所有相关的DLLs有效。例如,数据存取对象(DAO)所需的DLLs在不同的平台下是不同的。你可能不得不返回到安装程序查找该对象。InternetExplorer可能试图创建对象,但是在InternetExplorer中没有正确的安全许可。重置InternetExplorer安全设置并重试。类不支持自动化试图操作一个并不支持自动化的对象属性或方法。可以创建并将指针传递给不支持自动化的对象,但是不能获取它的属性和方法。要纠正该错误查创建对象应用程序的文档中关于该类自动化使用的限制。注意对象可能已经通过使用CreateObject被创建,但可能已经通过主机对象模型被引入。在自动化操作中未找到文件名或类名使用GetObject函数,但是将一个不可识别的类或文件名作为参数。GetObject函数要求包含要获取的对象的文件的完整的路径和名称,或者是在系统中注册过的类名称。要纠正该错误检查名称的拼写错误,然后重试。确保class参数的名称与在系统中注册的相匹配。对象不支持该属性或方法对该自动化对象指定了一个并不存在的属性或方法。不是所有的对象都支持所有的属性和方法。要纠正该错误检查属性和方法以确保没有打字错误。参见对象的文档获取的信息。对象不支持此操作试图引用该对象不支持的一个方法或属性。不是所有的对象支持所用的操作。要纠正该错误检查属性和方法以确保没有打字错误。参见对象的文档获取的信息。对象不支持当前的区域设置试图操作一个不支持当前区域设置的对象。区域设置是和给定语言以及国家/地区相对应的一系列信息。本地影响预定义程序项的语言和本地特定设置。以下两种情况时本地信息很重要:codelocale影响语言项例如关键词,并且定义本地特定设置例如小数和列表分割符,日期格式和字符排列顺序。systemlocale影响本地相关的功能执行。例如,当显示数字或者将字符串转换为日期时。使用操作系统提供的控制面板工具来设定系统。要纠正该错误检查对象支持的区域设置。未找到命名参数调用一个过程并指定一个特别的参数,但是过程未被定义为接受以为名称的参数。除非在过程定义中出现,一个命名参数不能在过程调用中使用。要纠正该错误检查参数名称是否正确拼写,然后再试着调用过程。参数不可选调用过程但是参数数量错误。传递给过程的参数的数量必须与过程定义的参数数量相同。要纠正该错误检查函数符号确保提供了所有必须的参数。错误的参数个数或无效的参数属性值调用过程时如果:错误的过程名称,或者,过程中参数数目错误,或者,参数类型错误。传递给过程的参数数目必须与过程定义中的参数数目相符。要纠正该错误检查以确保传递给过程的参数列表与过程定义或声明中的相符。对象不是一个集合试图对一个不是Collection类型的对象进行只对Collection对象有效的操作。有些属性、方法和操作仅可应用于Collection对象。Collection对象是包含一组互相关联的对象的一种对象。一旦集合中发生了改变,一个对象在Collection对象中的位置也会发生改变;因此,Collection对象中的任何一个对象的位置都可能变化。要纠正该错误检查对象或属性名称的拼写。验证对象是一个Collection对象。查看用来向集合中添加该对象的Add方法,确保语法正确且任何标识符的拼写都正确。变量使用了VB不支持的自动化类型试图使用类型库或者对象库中不被支持的数据类型,任何一门编程语言都不能使用类型库或对象库中的所有变量。要纠正该错误只使用VB识别的变量类型。远程服务器不存在或者不能访问用CreateObject函数来建立一个远程机器的对象,但是调用失败,这是因为无法访问远程服务器或者没有包含特定的类。要纠正该错误检验远程服务器的名字是否正确。检验远程服务器的DCOM可用。使用dcomcnfg验证安全权限是否允许建立对象。无效图片试图加载一个无法识别格式的图像。有效格式包括位图(*.bmp),图标(*.ico),以及Windows元文件(*.wmf)。要纠正该错误确保要加载的图像文件的格式是有效的。变量未定义在脚本开始处用OptionExplicit语句,后来又使用一个未被说明的变量名称。当使用OptionExplicit语句时,必须用Dim,Private,Public或者ReDim语句显式地说明所有的变量。要纠正该错误使用OptionExplicit语句时,确保用Dim,Private,Public,OrReDim语句定义了所有的变量。脚本对象不安全试图使用未被标识为脚本安全的对象。对象创建是否安全由主机决定。总的来说,允许不信任脚本进行有害操作(例如操作硬盘)的对象是不安全的。例如,使用作为客户端的MicrosoftInternetExplorer运行FileingObject是不安全的,但是可以在带有WindowsHost的本地机器使用该对象。要纠正该错误确保在使用一个安全的对象。与对象开发者联系看是否为安全版本。阅读对象文档发现该对象是否安全。对象不能安全初始化试图使用未被标识为初始化安全的对象。对象创建是否安全由主机决定。总的来说,允许不信任脚本进行有害操作(例如操作硬盘)的对象是不安全的。例如,使用作为客户端的MicrosoftInternetExplorer运行FileingObject是不安全的,但是可以在带有WindowsHost的本地机器使用该对象。要纠正该错误确保在使用一个安全的对象。与对象开发者联系看是否为安全版本。阅读对象文档发现该对象是否安全。对象不能安全创建试图使用一个未被标识为安全创建的对象。对象创建是否安全由主机决定。总的来说,允许不信任脚本进行有害操作(例如操作硬盘)的对象是不安全的。例如,使用作为客户端的MicrosoftInternetExplorer运行FileingObject是不安全的,但是可以在带有WindowsHost的本地机器使用该对象。要纠正该错误确保在使用一个安全的对象。与对象开发者联系看是否为安全版本。阅读对象文档发现该对象是否安全。无效或不合格的引用试图对不止一个对象使用With语句。With语句只能被非空对象使用。下面演示了一个With块的正确结构。WithobjectstatementsEndWith要纠正该错误为With语句指定一个对象。类未定义引用未定义(通过New或Set语句)的类。要纠正该错误确保在引用类之前已经定义。发生异常脚本调用COM对象,然后产生异常。要纠正该错误除非该调用由Raise方法产生,请与产生错误的CM对象开发人员联系。请与微软产品服务联系报告出现错误消息的情况。正则表达式中的语法错误搜索字符串的结构违背了VB正则表达式中的一个或多个语法规则。要纠正该错误保证常规的搜索字符串的表达式符合Perlde的表达语法。错误的数量词当构造正则表达式的搜索模式时,没有正确的说明匹配的字符串。要纠正该错误确保搜索模式是正确构造的。在正则表达式中需要']'试图为正则表达式匹配创建一个字符类,但未包含右括号。将单独的字符组合放到方括号里可以将其装配到字符类中。例如,/[abc]/匹配字母“a”,“b”,或“c”中任意一个。要纠正该错误在正则表达式中添加右括号。在正则表达式中需要')'试图创建常规的嵌套表达式,但未包含“)”。在正则表达式中括号有几个目的。首先,它将分离的项组成为单个子表达式,所以项目可以通过*,+,?等等来当作一个单元来处理。要纠正该错误在常规的嵌套表达式中添加右(闭)括号“)”。字符集越界试图使用无效字符创建正则表达式。正则表达式是由字母数字和元字符组成的。要纠正该错误仅仅使用有效正则表达式字符来组成正则表达式。求采纳为满意回答。
⑩ WCF编程要用到什么编程语言要怎么学WCF编程
用.net语言来编写的
目前国内,Net最好的就是如鹏网了,基本上都是慕名而去的