0

我有这样的 WCF 服务:

[ServiceContract]
public class SomeService
{
    [WebInvoke(UriTemplate = "/test", Method = "POST")]
    public string Test()
    {
        using (var reader = OperationContext.Current.RequestContext.RequestMessage.GetReaderAtBodyContents())
        {
            var content = reader.ReadOuterXml().Replace("<Binary>", "").Replace("</Binary>", "");
            return content;
        }
    }
}

并且有一个这样的配置文件:

<?xml version="1.0"?>
<configuration>
  <system.web>
    <compilation debug="true" targetFramework="4.0" />
  </system.web>
  <system.serviceModel>
    <services>
      <service name="Project.SomeService">
        <endpoint address="" binding="webHttpBinding" contract="Project.SomeService"
                  bindingConfiguration="webHttpBinding_SomeService" behaviorConfiguration="endpointBehavior_SomeService" />
      </service>
    </services>
    <bindings>
      <webHttpBinding>
        <binding name="webHttpBinding_SomeService">
          <security mode="None"></security>
        </binding>
      </webHttpBinding>
    </bindings>
    <behaviors>
      <endpointBehaviors>
        <behavior name="endpointBehavior_SomeService">
          <webHttp helpEnabled="true" defaultOutgoingResponseFormat="Json" />
        </behavior>
      </endpointBehaviors>
      <serviceBehaviors>
        <behavior>
          <!-- To avoid disclosing metadata information, set the value below to false and remove the metadata endpoint above before deployment -->
          <serviceMetadata httpGetEnabled="true"/>
          <!-- 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="true"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
  </system.serviceModel>
  <system.webServer>
    <modules runAllManagedModulesForAllRequests="true"/>
  </system.webServer>
</configuration>

但是当我使用 fiddler 和这个 url 来调用它时POST

http://localhost:1111/SomeService.svc/Test

与身体:

asdasd

它反而返回YXNkYXNk,为什么会这样?

我的代码是 C#,框架 4,在 VS2010Pro 中构建。

请帮忙。提前致谢。

4

1 回答 1

4

某些东西是对结果或请求进行 base64 编码。ASCII 字节的asdasd输出与YXNkYXNkbase64 编码时一样。

目前尚不清楚您是如何提供正文的,但我建议您使用WireSharkFiddler查看确切的请求/响应,以确定发生 base64 编码的位置,然后找出原因,然后修复它。

编辑:现在我仔细查看了您的代码,看起来相当清楚。

您的请求可能包含二进制数据——这就是为什么您Binary在 XML 中有一个标签的原因。您决定忽略这一点,只将二进制数据的 XML 表示视为文本 - 但您不应该这样做。二进制数据通过 base64 以 XML 表示。所以,你应该:

  • 将 XML 解析为XML,而不是将外部 XML 获取为字符串,然后执行字符串操作
  • Binary以字符串形式获取标签的内容
  • 用于Convert.FromBase64String获取原始二进制数据
  • 如果您认为二进制数据最初是文本,请使用Encoding.GetString将其转换回来
于 2012-07-03T07:05:04.570 回答