2012-10-19 2 views
3

json을 사용하여 wcf 클라이언트를 사용하여 ColdFusion 9 서비스에 요청을 보내려고합니다. 그러나 요청의 content-type은 xml을위한 것입니다.WCF Rest 클라이언트가 잘못된 내용 유형을 보내고 있습니다.

다음은 서비스 계약입니다. 당신이 볼 수 있듯이 우리는 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 (클라이언트 ID) 호출이 통신 채널을 생성 할 system.servicemodel.clientbase 및 ChannelFactory에 사용. 엔드 포인트를 동적으로 변경하는 코드 위에 클라이언트 코드가있는 코드가 있으므로 클라이언트가 변경 한 엔드 포인트.

몇 가지 추가 정보 두 가지 응용 프로그램이 있습니다. 하나는 클라이언트 응용 프로그램을 호스팅하는 .net MVC 4 웹 응용 프로그램이고 다른 하나는 백엔드 서비스를 호스팅하는 .net WCF Server 응용 프로그램입니다. 웹 응용 프로그램에서는 ColdFusion 응용 프로그램을 호출 할 수 있지만 wcf 서버 응용 프로그램에서는 호출 할 수 없습니다. 이들은 모두 동일한 코드 기반을 사용하여 발신 전화를합니다.

내가 말할 수있는 한 설정은 둘 다 동일합니다.

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

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

당신이 요청이 전송되는 방법에 대한 코드를 게시 할 수 있습니까? 서비스에서 나가는 응답의 json으로 content-type을 설정하면 CreateUserResponse 객체가 json 형식으로 반환됩니다. – Rajesh

+0

두 번째 코드 스 니펫에는 요청을 보내는 코드가 있습니다. System.ServiceModel을 사용하여 요청을 보내는 데 사용되는 IClientChannel을 만듭니다. 요청을 구성하고 전송하기 위해 수행되는 모든 작업은 WCF에 의해 수행됩니다. – user1759444

+0

REST 요청을 수행하려고합니까? GetServiceClient는 wsdl에서 생성 된 프록시에 존재합니다. 당신이 그것을 사용하는 경우 SOAP을 사용하여 서비스를 호출하려는 것 같아요. RESTful 방식으로 WCF 서비스를 호출하려면 HttpWebRequest 클래스를 사용해야합니다. – Rajesh

답변

5

을 WebRequest 클래스를 사용하여 WCF 서비스를 호출하는 방법에 대한 몇 가지 예제 코드를 찾아주세요, 새 작업 상황에 맞는 범위를 만들어야합니다, 아래 코드와 비슷한 코드를 사용합니다.

국가 번호 :

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(); 
} 
+0

이것은 기본적으로 우리가 현재하고있는 것입니다. GetServiceClient 메서드는 클라이언트베이스를 반환합니다. 채널을 사용하여 서비스 메소드를 호출합니다. 이것은 작동하지 않습니다. 다음은 사용자가 콘솔 앱에서 동일한 작업을 수행하려고했지만 다른 서비스 호출 내에서 작동하지 않는 또 다른 게시물입니다. http://stackoverflow.com/questions/9567589/wcf-service-calling-a-client-to-access-rest-using-json-is-not-giving-correct-c?rq=1 – user1759444

+0

tou는 새로운'OperationContextScope', 그리고 그 범위 내에서 요청을하는 것? – carlosfigueira

+0

당신이 맞습니다, 나는 그걸 놓쳤습니다. 작업 컨텍스트가 내 문제를 해결 한 것으로 보입니다. 고맙습니다. – user1759444

0

가 서비스 내에서 WCF REST 클라이언트를 사용하려면

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;    
    } 
+0

그래서 WCF 프레임 워크를 사용하여이 모든 것들이 추상화 된 서비스를 만들 수 있습니다. 그러나 편안한 서비스를 찾으려면 모든 일을 직접해야합니다. 그건 옳지 않은 것 같아요. 내가보고있는 것이 아닙니다. 나는 편안한 서비스를 부를 수 있으며 한 시나리오에서 모든 것이 잘 작동한다. 다른 하나는 content-type이 잘못 설정되어 있다는 것입니다. – user1759444

관련 문제