3

wcfクライアントを使用してjsonを使用してColdFusion9サービスにリクエストを送信しようとしています。ただし、リクエストのコンテンツタイプは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);
}

また、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);
}

送信されるリクエストは次のとおりです

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"}

正しいコンテンツタイプを使用するためにこれを取得するにはどうすればよいですか?

編集:

内部的には、GetServiceClient(clientId)呼び出しは、system.servicemodel.clientbaseとChannelFactoryを使用して通信チャネルを作成します。クライアントによって変更を呼び出すエンドポイント。その上に、エンドポイントを動的に変更するためのコードがあります。

いくつかのより多くの情報。2つのアプリケーションがあります。1つはクライアントアプリをホストする.netMVC4 Webアプリケーションで、もう1つはバックエンドサービスをホストする.netWCFサーバーアプリケーションです。WebアプリケーションからColdFusionアプリを正常に呼び出すことはできますが、wcfサーバーアプリケーションを呼び出すことはできません。これらは両方とも同じコードベースを使用して発信呼び出しを行います。

私が知る限り、構成は両方で同じです。

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

<client>
<endpoint name="ServiceAgreementRequestService" address="http://PLACEHOLDER/" binding="webHttpBinding" behaviorConfiguration="WcfRestBehavior" contract="IServiceAgreementRequestService"/>
4

2 に答える 2

5

サービス内でWCFRESTクライアントを使用するには、次のようなコードを使用して、新しい操作コンテキストスコープを作成する必要があります。

発信コード:

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); 
} 

その他の実装

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();
}
于 2012-10-19T17:23:59.390 に答える
0

WebRequest を使用して WCF サービスを呼び出す方法のサンプル コードを見つけてください。

var request = WebRequest.Create(string.Concat(serviceUrl, resourceUrl)) as HttpWebRequest;
            if (request != null)
            {
                request.ContentType = "application/json";
                request.Method = method;
            }

            if(method == "POST" && requestBody != null)
            {
                requestBodyBytes = ToByteArrayUsingDataContractSer(requestBody);
                request.ContentLength = requestBodyBytes.Length;
                using (Stream postStream = request.GetRequestStream())
                    postStream.Write(requestBodyBytes, 0, requestBodyBytes.Length);                    
            }

            if (request != null)
            {
                var response = request.GetResponse() as HttpWebResponse;
                if(response.StatusCode == HttpStatusCode.OK)
                {
                    Stream responseStream = response.GetResponseStream();
                    if (responseStream != null)
                    {
                        var reader = new StreamReader(responseStream);
                        responseMessage = reader.ReadToEnd();                        
                    }
                }
                else
                {   
                    responseMessage = response.StatusDescription;
                }
            }

    private static byte[] ToByteArrayUsingDataContractSer<T>(T requestBody)
    {
        byte[] bytes = null;
        var serializer1 = new DataContractSerializer(typeof(T));            
        var ms1 = new MemoryStream();            
        serializer1.WriteObject(ms1, requestBody);
        ms1.Position = 0;
        var reader = new StreamReader(ms1);
        bytes = ms1.ToArray();
        return bytes;            
    }
于 2012-10-19T16:59:37.547 に答える