2012-10-18 3 views
5

저는 C#으로 WCF를 만들고 동시에 클라이언트에서 사용하려고합니다. 어떤 이유로 int를 반환하는 메서드를 가져 오는 데 문제가 있습니다. 나는 그것을 구현 한WCF가 int를 반환하지 않습니다.

다음
[ServiceContract] 
public interface IMData 
{ 
    [OperationContract] 
    int ReturnAnInt(); 

    [OperationContract] 
    String HelloWorld(); 
} 

은 다음과 같습니다 : 여기 내 계약이다

public class MData : IMData 
{ 
    public String HelloWorld() 
    { 
    return "Hello World"; 
    } 

    public int ReturnAnInt() 
    { 
    return 5; 
    } 
} 

나는 비주얼 스튜디오를 사용하고, 클라이언트를 위해, 나는 웹 참조로이 WCF를 수입했다. 이제 MData의 인스턴스를 선언하고 HelloWorld를 호출하려고 할 때 아무런 문제가 없지만 ReturnAnInt를 호출 할 때 컴파일 오류가 발생합니다.

MData m = new MData(); 
String helloWorld = m.HelloWorld(); 
int result = m.ReturnAnInt(); 

내가 ReturnAnInt으로 얻을 오류 : 는 "어떤 과부하 방법 'ReturnAnInt'에 대한지지 않습니다 0 인수"그럼 나 마우스를 통해 기대 비주얼 어떤 스튜디오보고,이 방법은 보이는 것을 말한다합니다 같은 :

void MData.ReturnAnInt(out int ReturnAnIntResult, out bool ReturnAnIntResultSpecified) 

지금은 시간이를 통해 벽에 내 머리를 두드리는 된 구글에서 아무것도 찾을 수 있고, 내 동료뿐만 아니라 당황하고있다. 왜 정의에없는 두 개의 매개 변수를 추가하고 반환 유형을 변경 했습니까? 어떤 도움이라도 대단히 감사하겠습니다. 도움이 될만한 정보를 빠뜨리면 사과드립니다.

답변

4

웹 참조 (이전 기술) 대신 서비스 참조 (최신 기술)로 가져올 수 있습니까? 서비스 참조를 통해 WCF 서비스와 함께 작업하고 이러한 문제를 보지 못했습니다. Specified 속성 만 보았습니다. (과 함께 속성으로, out 매개 변수가 아닌 매개 변수가 아닌 경우) int이 허용됩니다. 지정된 (WCF 생성 서비스 정의는 내 경험에 의하면 예상대로 작동 함). 당신이 더 나은 솔루션을 찾을 수없는 경우

가 여기 partial classes를 사용하여 해결 방법입니다 :

public partial class MData 
{ 
    public int ReturnAnInt() 
    { 
     int result; 
     bool specified; 
     this.ReturnAnInt(out result, out specified); 
     if (!specified) throw new InvalidOperationException(); 
     return result; 
    } 
} 

업데이트http://www.codeproject.com/Articles/323097/WCF-ASMX-Interoperability-Removing-the-Annoying-xx (당신이 struct 돌아 언제든지 아니라 int의 일을 할이 것) 근본적인 원인은 WCF가 열악한 (틀림없이 부정확 한) WSDL을 생성한다는 것입니다. 실제로 요소가 필요없는 요소에 minOccurs="0"이 있습니다. 웹 참조 (Web References)는 이것을 그대로 읽고, 처리하려는 클럭 코드를 생성합니다. 당신은 이름 공간 (서비스 참조로 가져

[ServiceContract] 
public interface IMData 
{ 
    [OperationContract] 
    MyInt ReturnAnInt(); 

    [OperationContract] 
    String HelloWorld(); 
} 
public class Service1 : IMData 
{ 
    public MyInt ReturnAnInt() 
    { 
     return 4; 
    } 

    public string HelloWorld() 
    { 
     return "Hello World"; 
    } 
} 
+0

는 WCF는 정말'out' 매개 변수를 지원합니까? – abatishchev

+0

네,하지만 그게 무슨 질문에 관한 건 아니에요. 질문에 설명 된 문제는 WCF C# 코드가'out' 매개 변수 또는 선택적'int's를 지정하지 않지만 웹 참조 코드 생성기가이를 생성하는 방식입니다. 이 작동합니다. 그러나,'int ReturnAnInt (out int otherInt);와 같은 WCF 서비스를 정의 할 수 있으며, 이는 작동하고, Service Reference와 Web Reference로 접근 할 수 있습니다. 생성 된 WSDL은 단순히 여러 요소가 포함 된 응답 객체이므로 다른 클라이언트 언어에서도 사용할 수있는 무언가를 생성해야합니다. –

+0

답변 해 주셔서 감사합니다. 매우 도움이되었습니다. 서비스 참조로 가져 와서 문제가 해결되었습니다. :) –

2

: 메서드의 반환 형식을 수정과 함께

[MessageContract(IsWrapped = false)] 
public class MyInt 
{ 
    [MessageBodyMember] 
    public int Result { get; set; } 

    public static implicit operator MyInt(int i) 
    { 
     return new MyInt { Result = i }; 
    } 

    public static implicit operator int(MyInt m) 
    { 
     return m.Result; 
    } 
} 

: 자신의 글을 바탕으로, 당신은 대신 int의 유형을 반환 할 수 있습니다 MData) 대신 웹 참조. 코드에서 아무 문제가 없습니다

그리고 아래의 코드를 사용

,

MDataClient m = new MDataClient(); 
String helloWorld = m.HelloWorld(); 
int result = m.ReturnAnInt(); 

. 서비스 참조를 추가하고 위의 스 니펫을 사용하면 잘 작동합니다.

0

비슷한 문제가있어서 웹 서비스의 out int 매개 변수를 사용할 수 없습니다. 나는 이것이 정확하게 무엇 때문에 아직도 확실하지 않다. 그러나 stringout 매개 변수로 사용하여 작업했다. 클라이언트 측에서

s_uId = uId.ToString(); 

: 웹 서비스 측

[OperationContract] 
LoginStatus GetLogin(string username, string password, out string s_uId); 

int uId; 
string s_uId; 
result = client.GetLogin(username, password, out s_uId); 
Int32.TryParse(s_uId, out uId); 
관련 문제