当前位置:编程学习 > C#/ASP.NET >>

c++调用c#中的方法,返回字符串含“\,/”如何解决

现在WCF写的一个方法(返回类型为string),另一台机器上c++调用这个方法,当结果中含有\,/时,c++那边接受到的会变成\\,\/,

我也有在c#中调试,c#返回的结果确实只是\,/而不是\\,\/。但用抓包软件抓出来后发现c#传的竟然真的是\\,\/给c++

请问原因是什么?如何解决? --------------------编程问答-------------------- c#如果接收字符串含有\"等字符时,会自动进行转义,从而导致传给c++的也是转义后的格式
不知道能否采用字符替换的方式来避免这个问题 --------------------编程问答-------------------- 可为什么/也是呢?/不需要转的。 --------------------编程问答-------------------- 字符串前面加@试试 --------------------编程问答-------------------- 另外我知道@属于强制不转义字符串,但我怎么加到string前面呢?比如说string a="\n",怎么将@加到a前面?? --------------------编程问答-------------------- string a=@"\n" --------------------编程问答-------------------- 看看有没有那个wcf的方法的Attribute是可以处理这个的 --------------------编程问答-------------------- 即便你追加了又有什么用呢,只要你是字符串传递的方式,通过了C#,还是会自动转义,是不会解析的,之前遇到过这样的,反正我最终的解决方案就是处理数据源,以保障传递给c#的不包含那些字符. --------------------编程问答--------------------
引用 5 楼 ssp2009 的回复:
string a=@"\n"

如何在a前面加。a的值是变的。 --------------------编程问答--------------------
引用 6 楼 sandy945 的回复:
看看有没有那个wcf的方法的Attribute是可以处理这个的

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 

试下 --------------------编程问答--------------------
引用 12 楼 findcaiyzh 的回复:
你是不是在Debug或者Watch窗口中看的?

在我的winform客户端中,调用web method后,vs中的hint和Watch, quick watch窗口中都是\\
但是点击那个小放大镜,在Text Visualizer中是\


我是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++调用时,参数含上面的特殊字符,就调不到了!



很困扰,如果有人能够帮忙解决,或者给点建设性提示,小弟不胜感激。 --------------------编程问答--------------------
引用 12 楼 findcaiyzh 的回复:
你是不是在Debug或者Watch窗口中看的?

在我的winform客户端中,调用web method后,vs中的hint和Watch, quick watch窗口中都是\\
但是点击那个小放大镜,在Text Visualizer中是\

这个我知道,确实是这样的。原理就不知道了,跟c#的编译器有关(我瞎说的。。)?? --------------------编程问答--------------------
引用 14 楼 takako_mu 的回复:
引用 12 楼 findcaiyzh 的回复:
你是不是在Debug或者Watch窗口中看的?

在我的winform客户端中,调用web method后,vs中的hint和Watch, quick watch窗口中都是\\
但是点击那个小放大镜,在Text Visualizer中是\


我是c++调用c#,结果是有问题的。


但是在fiddler中看到只有一个\。 --------------------编程问答--------------------
引用 13 楼 sandy945 的回复:
return string.Format("You \\ entered: {0}", value);
=>
 return string.Format("You \\,/ entered: {0}", value);


bisicHttpBinding 换成 netTcpBinding 

试下


明天去单位试一试。 --------------------编程问答--------------------
引用 18 楼 findcaiyzh 的回复:
引用 13 楼 sandy945 的回复:

return string.Format("You \\ entered: {0}", value);
=>
return string.Format("You \\,/ entered: {0}", value);


bisicHttpBinding 换成 netTcpBinding

试下


明天去单位试一试。

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中进行测试.
结果见下图
   
   

好像也没啥问题。

   你得共享下你的代码,得看看问题究竟在那里。
    --------------------编程问答-------------------- 能看到图吧? --------------------编程问答--------------------
引用 21 楼 findcaiyzh 的回复:
能看到图吧?

能的。谢谢,我试下。 --------------------编程问答-------------------- 你的response数据是:You \./ entered:13。
这个不对啊。少了个\?? --------------------编程问答-------------------- 加@之后,用""把后面的引起来强制转换就可以 --------------------编程问答-------------------- 楼主的代码有问题。任何的传输都是基于二进制的。只要你在传入的是什么样的字符。输出的肯定不会变。


public string GetData(int value)
  {
  return string.Format("You \\,/ entered: {0}", value);
  }

string s=GetData(22);//楼主应该看看s到底是多少?


楼主晕了。
--------------------编程问答--------------------
引用 23 楼 takako_mu 的回复:
你的response数据是:You \./ entered:13。
这个不对啊。少了个\??


\\在C#里不是转义吗? --------------------编程问答-------------------- STRING转为比特流传试试,看看客户端接收结果以及转换回来的结果
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,