2009-08-24 3 views
5

임 여행의 둘레에 저장 생성자 일부 인수를 취하는 웹 서비스를 만들려고하지만 오류가 계속 : '1'인수를 사용하는 생성자를 포함하지 않는 CS1729 "서비스 이름"을Webservice C# 생성자가 인수를 허용하지 않습니까?

때 비록 내가 로컬로 (서비스와 동일한 프로젝트에서) 모든 것을 잘 작동하도록 만들려고 노력한다. 무엇이 제공 되는가?

웹 서비스 :

public class ayyash : System.Web.Services.WebService { 

    private string _myname; 
    public ayyash (string myname) { 


     _myname = myname; 

     //Uncomment the following line if using designed components 
     //InitializeComponent(); 
    } 
} 

소비 :

ayyash a = new ayyash("my name is ayyash"); 

출력 :

Compiler Error Message: CS1729: 'ayyash' does not contain a constructor that takes '1' arguments 
+0

테스트하지는 않았지만 WebMethod로 노출 된 생성자입니까? –

+1

당신은 웹 모방으로 생성자를 노출 할 수 없다 – Ayyash

답변

7

. 서버 측 객체가 생성 될 때 호출됩니다. 즉, 웹 서비스 메서드가 호출 될 때 및 호출됩니다.

웹 서비스에 인스턴스 멤버를 추가 할 필요가 없습니다. 당신은 constructior에서 "name"을 받아 들일 수없고 다른 메소드에서 그것을 사용할 수 없습니다. 각 웹 서비스 메소드에 "name"을 인수로 보내야합니다.요컨대 웹 서비스 "상태"는 메소드 인수 또는 쿠키를 통해 서비스에 전달되어야합니다 (그러나 후자를 사용하면 WCF로 이동하는 경우 문제가 발생 함).

프록시 개체에서 메서드를 호출 할 때마다 새 서버 쪽 개체가 만들어지고 해당 개체가 소멸되기 전에 해당 메서드가 호출된다고 상상해보십시오. 이것은 엄격하게 사실이 아니며 (객체를 풀링 할 수는 있지만) 웹 서비스를 설계하는 데 도움이됩니다.

+0

예, 웹 서비스 상태를 설명하는 데 도움이되는 설명서 또는 문서가 있습니까? 메신저에 대한 답변을 찾고 : 왜 private 변수는 생성자 내부에 설정된 경우 값을 유지하지만 웹 메서드에 설정된 경우에는 유지되지 않습니까? – Ayyash

+0

그 시나리오는 이상하게 들릴지 모르겠지만 수영장 인스턴스와 새 인스턴스를 순전히 우연히 받기 때문에이 시나리오가 가장 가능성이 높습니다. 웹 서비스 (ASMX 또는 WCF)의 유일한 멤버 변수는 종속성 (예 : 리포지토리 등)이어야합니다. 웹 서비스 멤버 변수에 상태를 저장하려고하면 고통이 발생합니다. –

2

서비스 요청 메시지에 default constructor will be called when the service host creates an instance in request.

기본 생성자를 사용하여 필요한 데이터를 가져 오지 않는 이유는 무엇입니까? 매개 변수화 된 생성자에 위임 할 수 있습니다.

public MyWebService : this(xxx) {} 

내 말은 서비스 호스트가 항상 (기본 생성자를 통해 요청을 처리하는 클래스의 인스턴스를 만들 것입니다 당신이 그것을 매개 변수를 전달하려는 경우 여러 옵션이 있습니다.

을 기본 생성자에서
  1. 는 IT가
  2. 다른 서비스 인스턴스 생성 메커니즘을 사용하는 (잘 모르겠어요) 요청 아마도
  3. extend/modify the asp.net request response pipe line의 데이터를 전달해야하는 데이터를 찾을 꺼. This link has some further examples.

WCF를 사용하면이 작업을보다 쉽게 ​​수행 할 수 있습니다. 또한 HTTPListener directly을 사용할 수 있습니다.

+0

어떻게? 기본 생성자에 인수를 전달하는 방법은 무엇입니까? – Ayyash

+0

기본 생성자가 필요하지 않으면 필요한 생성자를 사용하도록 기본 생성자를 수정하십시오. 그렇지 않으면 그것을 복사하고 인수를 추가하십시오. 이 코드 첫 번째 접근 방식은 웹 서비스 개발에 대한 최상의 접근 방식으로 간주되지 않습니다. WSDL과 스키마를 직접 생성하고 작업하는 것이 더 좋지만 느릴 수 있습니다. –

+0

나는 당신이 이해하지 못한다고 생각한다. 또는 뭔가를 놓치고있을 수도있다. 기본적으로 디폴트 컨스트럭터는 인자를 받아들이지 않는다. 그리고 클라이언트가 인자리스트를 가진 어떤 생성자도 호출하지 않는다. C# .net 웹 서비스에 대해? – Ayyash

6

클라이언트가 웹 서비스를 "인스턴스화"하면 서비스에서 생성자를 호출하지 않습니다. 서비스를 나타내는 로컬 프록시 객체를 인스턴스화합니다. .NET에서 생성 된 프록시 객체는 기본 생성자 만 지원합니다. 이 때문에 컴파일러 오류가 발생합니다.

로컬 개체가 작동하는 이유는 실제로 웹 서비스를 호출하지 않기 때문입니다. 로컬 객체를 인스턴스화 한 다음 메소드를 호출합니다.

WebMethod에 필요한 모든 데이터를 전달하기위한 접근 방식을 변경해야한다고 생각합니다. 웹 서비스의 일반적인 접근 방식은 요청 된 작업을 수행하는 데 필요한 모든 데이터를 받아들이는 Stateless 서비스를 갖는 것입니다. 예를 들어

:

당신이 당신의 클라이언트 프록시를 인스턴스화 할 때 서버 측 생성자가 호출되지
[WebMethod] 
public string DoSomething(string name, string otherData) 
{ 
    ayyash yourObject = new ayyash(name); 

    return yourObject.DoIt(otherData); 
} 
+0

실제로 내 기본 생성자가 호출됩니다 (Visual Studio를 사용하고 있습니다).하지만 문제가 발생했습니다. 문제가 발생합니다.하지만이 생각은 마음에 들지만,이 "상태없는"개념에 익숙해 져야합니다. – Ayyash

+0

생성자는 요청을 처리하기 위해 서비스 측에서 호출됩니다. 그는 기본이 아닌 생성자가 호출되기를 원합니다. –

+0

나는이 기사 [http://www.xml.com/pub/a/ws/2003/01/08/randyray.html]에서 다음을 읽었다 : "여기서 과부하가 걸리는 작업은 WSDL 1.1 (아래의 "리소스"섹션에있는 링크 참조), WSDL 1.2 초안 사양에서 제거되었습니다. " – Ayyash

관련 문제