WCF Rest Client发送错误的内容类型

use*_*444 3 c# rest coldfusion wcf json

我正在尝试使用wcf客户端向使用json的ColdFusion 9服务发送请求.但是,请求的内容类型是针对xml的.

这是服务合同.正如您所看到的,我们使用了json的RequestFormat.

[ServiceContract(Name = "ServiceAgreementRequestService", Namespace = NetworkNamespaces.ServiceNamespace)]
public interface IServiceAgreementRequestService
{
[OperationContract]
[FaultContract(typeof(RequestFault))]
[WebInvoke(UriTemplate = "?method=CreateUser", RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json)]
CreateUserResponse CreateUser(CreateUserRequest request);
}
Run Code Online (Sandbox Code Playgroud)

我还尝试在OutGoing请求上设置Request.ContentType,这也不起作用.

using (var context = this.GetServiceClient(clientId))
{
WebOperationContext.Current.OutgoingRequest.ContentType = "application/json; charset=UTF-8";
var request = new CreateUserRequest(user.Id, user.Person.FirstName, user.Person.LastName);
var response = context.Channel.CreateUser(request);
}
Run Code Online (Sandbox Code Playgroud)

这是发送的请求

POST http://somesite.domain.com/WebServices/ProviderService.cfc/?method=CreateUser HTTP/1.1
Content-Type: application/xml; charset=utf-8
VsDebuggerCausalityData: uIDPo7eh9U9jsBVLqVgGtqTK+eMBAAAAb++0xkOSQEmcAKZLgQEsp2/muY2ca6NJiul6pkAaWZwACQAA
Host: somehost.domain.com
Content-Length: 58
Expect: 100-continue
Accept-Encoding: gzip, deflate

{"UserId":4,"FirstName":"FirstName","LastName":"LastName"}
Run Code Online (Sandbox Code Playgroud)

如何使用正确的内容类型?

编辑:

在引擎盖下,GetServiceClient(clientId)调用使用system.servicemodel.clientbase和ChannelFactory来创建通信通道.我们调用客户端更改的端点,因此我们在这些端点之上​​有一些代码来动态更改端点.

更多信息.我们有两个应用程序:一个是用于托管客户端应用程序的.net MVC 4 Web应用程序,另一个是用于托管后端服务的.net WCF服务器应用程序.我可以从Web应用程序成功调用ColdFusion应用程序,但不能通过wcf Server应用程序调用.这些都使用相同的代码库来进行传出呼叫.

据我所知,配置对两者都是一样的.

<system.serviceModel>
<endpointBehaviors>
<behavior name="WcfRestBehavior">
<webHttp />
</behavior>

<client>
<endpoint name="ServiceAgreementRequestService" address="http://PLACEHOLDER/" binding="webHttpBinding" behaviorConfiguration="WcfRestBehavior" contract="IServiceAgreementRequestService"/>
Run Code Online (Sandbox Code Playgroud)

car*_*ira 5

要在服务中使用WCF REST Client,您需要使用类似于下面的代码创建新的操作上下文范围.

来电代码:

var client = this.GetServiceClient(clientId);
using (new OperationContextScope(client.InnerChannel))
{ 
    var request = new CreateUserRequest(user.Id, user.Person.FirstName, user.Person.LastName); 
    var response = client.CreateUser(request); 
} 
Run Code Online (Sandbox Code Playgroud)

其他实施:

class MyType : ClientBase<IServiceClient>, IServiceClient
{
    public MyType() : base("ServiceAgreementRequestService") { }
    public CreateUserResponse CreateUser(CreateUserRequest req)
    {
        return this.Channel.CreateUser(req);
    }
}

public MyType GetServiceClient(int clientId)
{
    return new MyType();
}
Run Code Online (Sandbox Code Playgroud)