c++调用c#中的方法,返回字符串含“\,/”如何解决
现在WCF写的一个方法(返回类型为string),另一台机器上c++调用这个方法,当结果中含有\,/时,c++那边接受到的会变成\\,\/,我也有在c#中调试,c#返回的结果确实只是\,/而不是\\,\/。但用抓包软件抓出来后发现c#传的竟然真的是\\,\/给c++
请问原因是什么?如何解决? --------------------编程问答-------------------- c#如果接收字符串含有\"等字符时,会自动进行转义,从而导致传给c++的也是转义后的格式
不知道能否采用字符替换的方式来避免这个问题 --------------------编程问答-------------------- 可为什么/也是呢?/不需要转的。 --------------------编程问答-------------------- 字符串前面加@试试 --------------------编程问答-------------------- 另外我知道@属于强制不转义字符串,但我怎么加到string前面呢?比如说string a="\n",怎么将@加到a前面?? --------------------编程问答-------------------- string a=@"\n" --------------------编程问答-------------------- 看看有没有那个wcf的方法的Attribute是可以处理这个的 --------------------编程问答-------------------- 即便你追加了又有什么用呢,只要你是字符串传递的方式,通过了C#,还是会自动转义,是不会解析的,之前遇到过这样的,反正我最终的解决方案就是处理数据源,以保障传递给c#的不包含那些字符. --------------------编程问答--------------------
如何在a前面加。a的值是变的。 --------------------编程问答--------------------
3q,我查查看 --------------------编程问答-------------------- 我觉得应该不会这样吧。 --------------------编程问答-------------------- 做了个测试:
vs2008新建wcf工程,修改两处地方
1. web.config中endpoint改成bisicHttpBinding
2. GetData返回字符串带\
public string GetData(int value)
{
return string.Format("You \\ entered: {0}", value);
}
客户端是winform,使用Add service Reference...加入引用。没做任何修改
调用为:
private void button1_Click(object sender, EventArgs e)
{
ServiceReference1.Service1Client client = new Testclient.ServiceReference1.Service1Client();
string res = client.GetData(10);
}
使用fiddler抓包。
request:
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"><s:Body><GetData xmlns="http://tempuri.org/"><value>10</value></GetData></s:Body></s:Envelope>
response:
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"><s:Body><GetDataResponse xmlns="http://tempuri.org/"><GetDataResult>You \ entered: 10</GetDataResult></GetDataResponse></s:Body></s:Envelope>
看起来没有问题啊。 --------------------编程问答-------------------- 你是不是在Debug或者Watch窗口中看的?
在我的winform客户端中,调用web method后,vs中的hint和Watch, quick watch窗口中都是\\
但是点击那个小放大镜,在Text Visualizer中是\ --------------------编程问答-------------------- return string.Format("You \\ entered: {0}", value);
=>
return string.Format("You \\,/ entered: {0}", value);
bisicHttpBinding 换成 netTcpBinding
试下 --------------------编程问答--------------------
我是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)]
public class DataServerHttp : IDataServerHttp
{
protected static ILog log = LogManager.GetLogger("DataServerLog");
public string ClientRequest(string queryString)
{
log.Info(string.Format("[Client]Client Request String:{0}", queryString));
}
}
就wcf中这么简单的一个方法,c++调用时,参数含上面的特殊字符,就调不到了!
很困扰,如果有人能够帮忙解决,或者给点建设性提示,小弟不胜感激。 --------------------编程问答--------------------
这个我知道,确实是这样的。原理就不知道了,跟c#的编译器有关(我瞎说的。。)?? --------------------编程问答--------------------
但是在fiddler中看到只有一个\。 --------------------编程问答--------------------
明天去单位试一试。 --------------------编程问答--------------------
thx --------------------编程问答-------------------- 测试了net.tcp,测试步骤:
1. vs2008中创建wcf service library.
2. 修改1:GetData改成
public string GetData(int value)
{
return string.Format("You \\,/ entered: {0}", value);
}
3. 修改config成net.tcp
* base address
<baseAddresses>
<add baseAddress = "net.tcp://localhost:8732/Design_Time_Addresses/WcfServiceLibrary1/Service1/" />
</baseAddresses>
* binding:
<endpoint address ="" binding="netTcpBinding" contract="WcfServiceLibrary1.IService1">
* Service behaviors:
<behavior name="WcfServiceLibrary1.Service1Behavior">
<!-- To avoid disclosing metadata information,
set the value below to false and remove the metadata endpoint above before deployment -->
<serviceMetadata/>
<!-- To receive exception details in faults for debugging purposes,
set the value below to true. Set to false before deployment
to avoid disclosing exception information -->
<serviceDebug includeExceptionDetailInFaults="False" />
</behavior>
其它都是默认的。
4. F5启动WCF test client来测试。
fiddler没法监控tcp协议,因此在WCFTestClient中进行测试.
结果见下图
好像也没啥问题。
你得共享下你的代码,得看看问题究竟在那里。
--------------------编程问答-------------------- 能看到图吧? --------------------编程问答--------------------
能的。谢谢,我试下。 --------------------编程问答-------------------- 你的response数据是:You \./ entered:13。
这个不对啊。少了个\?? --------------------编程问答-------------------- 加@之后,用""把后面的引起来强制转换就可以 --------------------编程问答-------------------- 楼主的代码有问题。任何的传输都是基于二进制的。只要你在传入的是什么样的字符。输出的肯定不会变。
public string GetData(int value)
{
return string.Format("You \\,/ entered: {0}", value);
}
string s=GetData(22);//楼主应该看看s到底是多少?
楼主晕了。
--------------------编程问答--------------------
\\在C#里不是转义吗? --------------------编程问答-------------------- STRING转为比特流传试试,看看客户端接收结果以及转换回来的结果
补充:.NET技术 , C#