@@ -60,6 +60,25 @@ private IList<ProxyDescriptor> GetProxyDescriptors()
6060 foreach ( var method in methods )
6161 {
6262 var proxyMethodDescriptor = new ProxyMethodDescriptor ( method ) ;
63+ bool isMultipartFormData = false ;
64+ foreach ( var parameter in method . GetParameters ( ) )
65+ {
66+ var modelMetadata = MetadataProvider . GetMetadataForParameter ( parameter ) ;
67+ if ( modelMetadata . IsFormFile )
68+ {
69+ isMultipartFormData = true ;
70+ if ( parameter . CustomAttributes
71+ . Any ( a => a . AttributeType . Name == "FromBodyAttribute" ) )
72+ {
73+ throw new ProxyException ( $ "Parameter: \" { parameter . ParameterType . Name } as { parameter . Name } \" " +
74+ "contains IFormFile type property. " +
75+ "Remove FromBody attribute to proper model binding." ) ;
76+ }
77+ }
78+
79+ proxyMethodDescriptor . Parameters . Add ( modelMetadata ) ;
80+ }
81+ proxyMethodDescriptor . IsMultiPartFormData = isMultipartFormData ;
6382
6483 var timeoutAttr = method . GetCustomAttribute < ApiTimeoutAttribute > ( ) ;
6584 if ( timeoutAttr != null )
@@ -91,7 +110,7 @@ private IList<ProxyDescriptor> GetProxyDescriptors()
91110 if ( routeTemplate != null )
92111 {
93112 proxyMethodDescriptor . RouteTemplate = routeTemplate ;
94- proxyMethodDescriptor . ParameterParts = new List < TemplatePart > ( routeTemplate . Parameters ) ;
113+ proxyMethodDescriptor . TemplateParts = new List < TemplatePart > ( routeTemplate . Parameters ) ;
95114
96115 proxyMethodDescriptor . TemplateKeys = routeTemplate . Segments
97116 . SelectMany ( s => s . Parts . Where ( p => p . IsLiteral )
@@ -104,40 +123,46 @@ private IList<ProxyDescriptor> GetProxyDescriptors()
104123 }
105124
106125 if ( httpMethodAttribute is HttpGetMarkerAttribute )
126+ {
107127 proxyMethodDescriptor . HttpMethod = HttpMethod . Get ;
128+ }
108129 else if ( httpMethodAttribute is HttpPostMarkerAttribute )
130+ {
109131 proxyMethodDescriptor . HttpMethod = HttpMethod . Post ;
132+ }
110133 else if ( httpMethodAttribute is HttpPutMarkerAttribute )
134+ {
111135 proxyMethodDescriptor . HttpMethod = HttpMethod . Put ;
136+ if ( proxyMethodDescriptor . HasAnyTemplateParameterKey )
137+ {
138+ for ( int i = 0 ; i < proxyMethodDescriptor . TemplateParameterKeys . Count ; i ++ )
139+ {
140+ var key = proxyMethodDescriptor . TemplateParameterKeys [ i ] ;
141+ var templatePartParameterOrderedModel = proxyMethodDescriptor . Parameters [ i ] ;
142+ if ( templatePartParameterOrderedModel == null || templatePartParameterOrderedModel . PropertyName != key )
143+ {
144+ throw new ProxyException ( $ "Key parameter: \" { key } \" does not match on the corresponding method parameter order.") ;
145+ }
146+
147+ if ( ! templatePartParameterOrderedModel . IsSimpleType )
148+ {
149+ throw new ProxyException ( $ "Key parameter: \" { key } \" type: \" { templatePartParameterOrderedModel . ModelType . Name } \" " +
150+ $ "must be ProxyModelMetadata.IsSimpleType to proper HTTP PUT Uri-Key (Url) model binding.") ;
151+ }
152+ }
153+ }
154+ }
112155 else if ( httpMethodAttribute is HttpDeleteMarkerAttribute )
156+ {
113157 proxyMethodDescriptor . HttpMethod = HttpMethod . Delete ;
158+ }
114159 }
115160 else
116161 {
117162 // Default GET
118163 proxyMethodDescriptor . HttpMethod = HttpMethod . Get ;
119164 }
120165
121- bool isMultipartFormData = false ;
122- foreach ( var parameter in method . GetParameters ( ) )
123- {
124- var modelMetadata = MetadataProvider . GetMetadataForParameter ( parameter ) ;
125- if ( modelMetadata . IsFormFile )
126- {
127- isMultipartFormData = true ;
128- if ( parameter . CustomAttributes
129- . Any ( a => a . AttributeType . Name == "FromBodyAttribute" ) )
130- {
131- throw new ProxyException ( $ "Parameter: \" { parameter . ParameterType . Name } as { parameter . Name } \" " +
132- "contains IFormFile type property. " +
133- "Remove FromBody attribute to proper model binding." ) ;
134- }
135- }
136-
137- proxyMethodDescriptor . Parameters . Add ( modelMetadata ) ;
138- }
139-
140- proxyMethodDescriptor . IsMultiPartFormData = isMultipartFormData ;
141166 descriptor . Methods . Add ( method , proxyMethodDescriptor ) ;
142167 }
143168
0 commit comments