问题描述
现在WCF写的一个方法(返回类型为string),另一台机器上c++调用这个方法,当结果中含有,/时,c++那边接受到的会变成\,/,我也有在c#中调试,c#返回的结果确实只是,/而不是\,/。但用抓包软件抓出来后发现c#传的竟然真的是\,/给c++请问原因是什么?如何解决?
解决方案
解决方案二:
c#如果接收字符串含有"等字符时,会自动进行转义,从而导致传给c++的也是转义后的格式不知道能否采用字符替换的方式来避免这个问题
解决方案三:
可为什么/也是呢?/不需要转的。
解决方案四:
字符串前面加@试试
解决方案五:
另外我知道@属于强制不转义字符串,但我怎么加到string前面呢?比如说stringa="n",怎么将@加到a前面??
解决方案六:
stringa=@"n"
解决方案七:
看看有没有那个wcf的方法的Attribute是可以处理这个的
解决方案八:
即便你追加了又有什么用呢,只要你是字符串传递的方式,通过了C#,还是会自动转义,是不会解析的,之前遇到过这样的,反正我最终的解决方案就是处理数据源,以保障传递给c#的不包含那些字符.
解决方案九:
引用5楼ssp2009的回复:
stringa=@"n"
如何在a前面加。a的值是变的。
解决方案十:
引用6楼sandy945的回复:
看看有没有那个wcf的方法的Attribute是可以处理这个的
3q,我查查看
解决方案十一:
我觉得应该不会这样吧。
解决方案十二:
做了个测试:vs2008新建wcf工程,修改两处地方1.web.config中endpoint改成bisicHttpBinding2.GetData返回字符串带publicstringGetData(intvalue){returnstring.Format("You\entered:{0}",value);}客户端是winform,使用AddserviceReference...加入引用。没做任何修改调用为:privatevoidbutton1_Click(objectsender,EventArgse){ServiceReference1.Service1Clientclient=newTestclient.ServiceReference1.Service1Client();stringres=client.GetData(10);}使用fiddler抓包。request:<s:Envelopexmlns:s="http://schemas.xmlsoap.org/soap/envelope/"><s:Body><GetDataxmlns="http://tempuri.org/"><value>10</value></GetData></s:Body></s:Envelope>response:<s:Envelopexmlns:s="http://schemas.xmlsoap.org/soap/envelope/"><s:Body><GetDataResponsexmlns="http://tempuri.org/"><GetDataResult>Youentered:10</GetDataResult></GetDataResponse></s:Body></s:Envelope>看起来没有问题啊。
解决方案十三:
你是不是在Debug或者Watch窗口中看的?在我的winform客户端中,调用webmethod后,vs中的hint和Watch,quickwatch窗口中都是\但是点击那个小放大镜,在TextVisualizer中是
解决方案十四:
returnstring.Format("You\entered:{0}",value);=>returnstring.Format("You\,/entered:{0}",value);bisicHttpBinding换成netTcpBinding试下
解决方案十五:
引用12楼findcaiyzh的回复:
你是不是在Debug或者Watch窗口中看的?在我的winform客户端中,调用webmethod后,vs中的hint和Watch,quickwatch窗口中都是\但是点击那个小放大镜,在TextVisualizer中是
我是c++调用c#,结果是有问题的。
解决方案:
像c++调用c#,java调用.net的webservice这两天遇到的问题都挺类似的。java调.net,如p在java那接收到的就是p,\p就是p。所以我针对java做的就是在c#这边将replace成\再发过去。c++调用c#,如p在c++那接收到的就成了\p,\p就成了\\p。所以暂时在c++端收到的结果将\replace成可这总归不是办法啊,我很想知道错误的源头是什么?另外有个更奇怪的问题就是,c++调用wcf方法,当参数含#%&?=/时,根本就调不到wcf中的方法。代码如下:///<summary>///..///</summary>[ServiceBehavior(InstanceContextMode=InstanceContextMode.PerCall)]publicclassDataServerHttp:IDataServerHttp{protectedstaticILoglog=LogManager.GetLogger("DataServerLog");publicstringClientRequest(stringqueryString){log.Info(string.Format("[Client]ClientRequestString:{0}",queryString));}}
就wcf中这么简单的一个方法,c++调用时,参数含上面的特殊字符,就调不到了!很困扰,如果有人能够帮忙解决,或者给点建设性提示,小弟不胜感激。
解决方案:
引用12楼findcaiyzh的回复:
你是不是在Debug或者Watch窗口中看的?在我的winform客户端中,调用webmethod后,vs中的hint和Watch,quickwatch窗口中都是\但是点击那个小放大镜,在TextVisualizer中是
这个我知道,确实是这样的。原理就不知道了,跟c#的编译器有关(我瞎说的。。)??
解决方案:
引用14楼takako_mu的回复:
引用12楼findcaiyzh的回复:你是不是在Debug或者Watch窗口中看的?在我的winform客户端中,调用webmethod后,vs中的hint和Watch,quickwatch窗口中都是\但是点击那个小放大镜,在TextVisualizer中是我是c++调用c#,结果是有问题的。
但是在fiddler中看到只有一个。
解决方案:
引用13楼sandy945的回复:
returnstring.Format("You\entered:{0}",value);=>returnstring.Format("You\,/entered:{0}",value);bisicHttpBinding换成netTcpBinding试下
明天去单位试一试。
解决方案:
引用18楼findcaiyzh的回复:
引用13楼sandy945的回复:returnstring.Format("You\entered:{0}",value);=>returnstring.Format("You\,/entered:{0}",value);bisicHttpBinding换成netTcpBinding试下明天去单位试一试。
thx
解决方案:
测试了net.tcp,测试步骤:1.vs2008中创建wcfservicelibrary.2.修改1:GetData改成publicstringGetData(intvalue){returnstring.Format("You\,/entered:{0}",value);}3.修改config成net.tcp*baseaddress<baseAddresses><addbaseAddress="net.tcp://localhost:8732/Design_Time_Addresses/WcfServiceLibrary1/Service1/"/></baseAddresses>*binding:<endpointaddress=""binding="netTcpBinding"contract="WcfServiceLibrary1.IService1">*Servicebehaviors:<behaviorname="WcfServiceLibrary1.Service1Behavior"><!--Toavoiddisclosingmetadatainformation,setthevaluebelowtofalseandremovethemetadataendpointabovebeforedeployment--><serviceMetadata/><!--Toreceiveexceptiondetailsinfaultsfordebuggingpurposes,setthevaluebelowtotrue.Settofalsebeforedeploymenttoavoiddisclosingexceptioninformation--><serviceDebugincludeExceptionDetailInFaults="False"/></behavior>其它都是默认的。4.F5启动WCFtestclient来测试。fiddler没法监控tcp协议,因此在WCFTestClient中进行测试.结果见下图好像也没啥问题。你得共享下你的代码,得看看问题究竟在那里。
解决方案:
能看到图吧?
解决方案:
引用21楼findcaiyzh的回复:
能看到图吧?
能的。谢谢,我试下。
解决方案:
你的response数据是:You./entered:13。这个不对啊。少了个??
解决方案:
加@之后,用""把后面的引起来强制转换就可以
解决方案:
楼主的代码有问题。任何的传输都是基于二进制的。只要你在传入的是什么样的字符。输出的肯定不会变。publicstringGetData(intvalue){returnstring.Format("You\,/entered:{0}",value);}strings=GetData(22);//楼主应该看看s到底是多少?
楼主晕了。
解决方案:
引用23楼takako_mu的回复:
你的response数据是:You./entered:13。这个不对啊。少了个??
\在C#里不是转义吗?
解决方案:
STRING转为比特流传试试,看看客户端接收结果以及转换回来的结果