내 응용 프로그램에는 제거 할 수없는 고유 한 스크립팅 언어가 있습니다 (많은 고객 별 스크립트 작성). 이제는 고객이 스크립팅 언어에서 SOAP 서비스를 호출 할 수 있는지 묻는 중입니다. 물론 호출해야하는 SOAP 서비스는 모든 고객마다 다를 수 있습니다. 이것은 몇 가지 옵션으로 나를 잎 :자신의 스크립팅 언어에서 SOAP 서비스를 동적으로 호출하십시오.
- 는 고객 별 SOAP 클라이언트 프록시를 생성하기 위해 WSDL 유틸리티를 사용하여 고객 별 SOAP 클라이언트 프록시를 생성하는 내 응용 프로그램
- 를 사용하여 WSDL 유틸리티에서 고객 별 논리를 넣어 동적으로 SOAP 호출을 생성하는 일반적인 모듈을 쓰기 응용 프로그램이 일반적인 방법
- 에 플러그인을 호출 할 수있는 플러그인 시스템을 고객의 특정 DLL의에서 고객 별 논리를 넣어 예상
처음 두 옵션은 n 내 응용 프로그램 또는 고객 특정 DLL의 모든 고객 특정 논리를 원하지 않기 때문에 내 경우에는 o 진짜 대안.
제 3의 옵션은 내 컨설턴트 동료가 고객 별 개발없이 스크립트 언어를 통해 SOAP 서비스를 호출 할 수 있기 때문에 장기적으로는 최고입니다. 스크립팅 언어에 함수를 동적으로 추가하는 것은 문제가되지 않으며 동적 SOAP 호출을 생성합니다.
WSDL 유틸리티의 출력을 살펴 보았습니다. 그런 다음 더 이상 작동하지 않을 때까지 물건을 제거하기 시작했습니다. 다음 코드 조각은 여전히 작동 하나입니다 :
[System::CodeDom::Compiler::GeneratedCodeAttribute(L"wsdl", L"4.0.30319.1"),
System::Diagnostics::DebuggerStepThroughAttribute,
System::ComponentModel::DesignerCategoryAttribute(L"code"),
System::Web::Services::WebServiceBindingAttribute(Name=L"MyOwnScriptingSoapClient", Namespace=L"http://microsoft.com/webservices/")]
public ref class MyWebService : public System::Web::Services::Protocols::SoapHttpClientProtocol
{
public:
MyWebService() {}
public:
[System::Web::Services::Protocols::SoapDocumentMethodAttribute(L"http://microsoft.com/webservices/GetPrimeNumbers", RequestNamespace=L"http://microsoft.com/webservices/",
ResponseNamespace=L"http://microsoft.com/webservices/", Use=System::Web::Services::Description::SoapBindingUse::Literal, ParameterStyle=System::Web::Services::Protocols::SoapParameterStyle::Wrapped)]
System::String^ GetPrimeNumbers(System::Int32 max);
};
inline System::String^ MyWebService::GetPrimeNumbers(System::Int32 max) {
cli::array<System::Object^>^ results = this->Invoke(L"GetPrimeNumbers", gcnew cli::array<System::Object^>(1) {max});
return (cli::safe_cast<System::String^ >(results[0]));
}
웹 서비스의 URL이 URL 속성을 설정하여 동적으로 될 수 있지만, 나는 메소드 이름을 동적으로 만들 수있는 방법을 찾을 수 없습니다.
는 추가 같은 일반적인 방법은 여전히 작동하는 것 같다 :
...
[System::Web::Services::Protocols::SoapDocumentMethodAttribute(L"http://microsoft.com/webservices/GetPrimeNumbers", RequestNamespace=L"http://microsoft.com/webservices/",
ResponseNamespace=L"http://microsoft.com/webservices/", Use=System::Web::Services::Description::SoapBindingUse::Literal, ParameterStyle=System::Web::Services::Protocols::SoapParameterStyle::Wrapped)]
cli::array<System::Object^>^ CallWs(cli::array<System::Object^>^ args);
...
inline cli::array<System::Object^>^ MyWebService::CallWs(cli::array<System::Object^>^ args) {
cli::array<System::Object^>^ results = this->Invoke(L"GetPrimeNumbers", args);
return results;
하지만 곧 나는 GetPrimeNumbers 방법을 분리 할 때, 호출이 작동하지 않습니다를 더 이상 다음과 같은 오류보고 :
Unhandled Exception: System.ArgumentException: GetPrimeNumbers Web Service method name is not valid.
at System.Web.Services.Protocols.SoapHttpClientProtocol.BeforeSerialize(WebRequest request, String methodName, Object[] parameters)
at System.Web.Services.Protocols.SoapHttpClientProtocol.Invoke(String methodName, Object[] parameters)
at MyWebService.CallWs(Object[] args)
at main(Int32 argc, SByte** argv)
at _mainCRTStartup()
을
또한 SoapDocumentMethodAttribute 특성 (예 : GetPrimo)의 웹 서비스 이름을 변경하면이 동일한 오류가 발생합니다.
따라서, 내 질문 :
- 이는 WSDL을보고이 경로, 즉에서 계속 의미가 있습니까는 (모든) SOAP 서비스에 전화를 '일반화'를 시도 논리를 생성하거나 단순히 것 절대로 작동하지 않아?
- .Net을 사용하여 동적 인 방법으로 SOAP 호출을 생성하는 다른 좋은 방법이 있습니까?
- 또는 SOAP 호출을 수행하기 위해 XML (Soap Envelope)을 직접 만드는 유일한 방법은 무엇입니까?
- 계속 작업 할 수있는 몇 가지 예제 코드를 찾을 수 있습니까? 사전에
감사합니다, 패트릭
나는이 아이디어를 생각,하지만 난 싶지 않아 몇 가지 이유가 있습니다. 저는 컨설턴트와 고객의 특정 일을하는 또 다른 언어를 혼동하고 싶지 않습니다. 컨설턴트가 멋진 일을하지 못하게하고 싶습니다. 그러나 일단 C#을 사용할 수있게되면 불필요한 일이 발생합니다 (악몽이 될 것입니다. 지원). 스크립트 언어에서 웹 서비스로의 호출을 dirct로 제한하려고합니다. – Patrick
Hemant, 나는 생각을 다시하고 Webservice를 호출하는 Microsoft의 모든 문제에 대해 설명했습니다 (클래스의 메서드가 웹 서비스 메서드 인 yuck과 동일한 이름을 사용한다는 사실에 의존합니다). 그것은 여전히 좋은 생각이며 다른 가능성을 열어 줄 수도 있습니다. 이제 컨설턴트가 고객 별 C#을 작성하지 못하게하고 고객이 제공 한 .Net 어셈블리와 WSDL로 WebService 프록시를 생성하는 것만으로 제한합니다. 감사. – Patrick